答:1、当数据多,且字段中值重复比较多的使用普通索引,没有重复的时候可以使用唯一索引,多字段经常被查询时使用组合索引
2、如果表中增删改多,查询少,就不添加索引
3、不会出现where条件的字段不添加索引
2.什么是数据库事务?答:事务是一个不可拆分的数据库操作序列,是数据库并发控制的基本单位;在逻辑上就是要么一起成功,要么一起失败,是的数据库只能从一种一致性状态转变成另一种一致性状态。
3.事务有哪些特征?答:事务有四大特征,首先是原子性,也就是要么一起成功要么一起失败;再就是一致性,数据库中的数据只能从一种一致性 状态转变成另外一个一致性状态;再就是隔离性;保证在多线程之间,事务之间的一个安全问题,最后就是持久化,持久化也就是我们常说的将数据写入磁盘,即使数据库宕机,也能从磁盘中重新进行恢复,数据不会受到其他影响;
4、那你详细说一下都有哪些隔离级别?答:首先是级别最低的读未提交,他会出现幻读,脏读,不可重复读,一般不会使用这种级别,数据安全性太差,再就是读已提交,其他事务只能看到一提交事务所做的概念,他在读未提交的基础上避免的脏读。再就是可重复读,这个是mysql的默认隔离级别,他能保证同一个事务的多个实例能够能看到同样的数据,虽然改变之前级别的不可重复读的问题,但是还是会出现幻读的情况,如果要消除幻读就只能使用最高级别串行,他会强制事务进行排序,从而使的不会出现幻读的情况,但是一般在使用时也不会使用到这个级别,为了保证串行,会加入大量的锁,然后会引发大量的线程超时现象以及锁竞争,导致整个系统资源被大量占用,使得程序性能大打折扣,在实际使用中一般使用中间两种级别即可
5、解释一下什么是脏读、不可重复读、幻读?答:那我从脏读开始讲解,比如现在有a,b两个事务,数据库的初始值为null,此时a事务修改这个值,改为a,但是此时未提交,b事务进行读取数据,此时读取的数据为a,然后继续完成其他操作,突然a事务出现异常回滚数据,而事务b再次访问数据,此时数据突然为null,从而导致b事务执行过程中两次获取的数据不相同,导致b事务操作出现脏读;不可重复读;就是说在同一次事务中多次查询数据出现不相同的情况,为什么会出现这样的情况,我简单说一下,比如我们现在有三个事务,分别是abc三个事务,a事务主要进行多次查询数据,数据初始为null,此时b事务修改数据,修改为b,且提交数据,按道理说a就是可以查询数据的,此时会查询到b,此时a还没提交事务,c又去修改了值,修改为c,并提交事务,a事务再次访问数据,此时却访问到的数据却是c,在同一个事务中访问的数据居然不一致,从而导致不可重复读;不过这个可以在开发中编写的时候控制查询统一数据的次数来进行控制,再就是幻读,幻读也是多次查询出现的问题,比如我们现在再进行范围查询,查询id>10的数据,可能之前数据库原本可以查出来10条,但是b事务增加了几条符合范围的数据,并且提交事务,a事务再次范围查询就会多出几条数据,也就是我们常说的幻读
6、对于锁了解吗?答:锁机制主要功能就是保证数据的安全;对于锁,主要出现在并发情况下,就比如原来酒店如何不设置门,所有人都可以进入房间,就会造成线程抢占的情况,会导致数据出现不一致的情况,那么为了解决这个问题,就需要给房间设置一个带锁的门,只有从酒店申请到钥匙的人才能进去房间,使用完毕之后,将我们钥匙交还给我们酒店,其他人才能去申请这把钥匙进入房间。
7、mysql中有使用到哪些锁?答:mysql有这么两类锁,首先是共享锁,锁如其名,共享,多个线程可以同时获取这把锁进行操作,一般使用在我们读操作,读取数据不会去修改数据本身,不会引发安全问题;再就是排他锁,也叫独占锁,一般用于我们写入数据时,表示线程在他使用期间,其他线程不能够获取到这个锁,只有当这个线程释放锁资源后,其他线程才能获取锁
8、什么是死锁?如何解决死锁问题?答:比如现在有两个线程分别占用一个资源,并且双方都在等待各自占用的资源就会出现死锁现象
也就是说我们形成死锁要满足这个几个条件:
1.互斥条件;也就是资源都线程独占的。
2请求与保持资源:也就是在请求资源的同时对于自身占用的资源不释放
3.不剥夺条件:线程已经获取的资源在使用完之前无法被其他线程强制剥夺,只有当前线程使用完毕才会被释放
4.循环等待条件:也就是互相进行等待。
那么我们现在知道形成死锁的原因,那么我们就可以去解决死锁问题了,正常来说我们只需要去形成死锁的四种条件之一就可以破坏死锁的形成,但是对于互斥条件我们是无法进行破坏的,因为共享数据本身就要求互斥,所以我们只需要破坏其他三种条件任意一个即可解决死锁问题
9、什么是悲观锁,什么是乐观锁?答:悲观锁的特点就是线程独占,当需要修改数据库数据时,为了避免其他线程也会去修改数据库的数据,他会直接对当前线程进行加锁,在修改数据之前就进行加锁操作,其他线程需要等当前线程释放锁才能执行。乐观锁一般需要在写操作多的时候使用,保证数据的安全性。再就是乐观锁,乐观锁他假设所有数据都不会出现冲突,只在事务提交更新的时候,才会正式去判断是否出现冲突,如果出现冲突就会返回异常信息给用户,乐观锁一般在读多写少的情况下使用。对于他们的总结就是悲观锁用于写多的时候,且容易出现死锁问题,乐观锁一般在读多的时候使用,可以用版本控制去判断冲突,不会出现死锁问题
10、工作中你是如何优化sql的?答:可以从四个方面去讲sql的优化
1.通过增加索引提高sql语句的检索速率
2.通过合理设计表来提高sql的查询速度
3.通过优化sql语句结构来提高查询速率(通过explain)
4.读写分离
5.分库分表
sql优化的一般步骤
1.通过show status 命令了解各种sql的执行频率
2.通过慢查询日志定位执行效率比较低的sql语句
3.通过explain分析 低效率sql的执行计划
4.然后修改sql语句



