1、为什么使用索引?简单谈谈我对索引的理解?
使用索引一般是为了解决实际开发中的慢查询问题,出现慢查询大部分是因为表里的数据量比较大,MySQL使用索引其实和我们采用redis缓存中间件有相似的设计之处,主要利用了在内存处理数据比在磁盘进行IO操作高效这一特点。
2、mysql的innoDB使用了B+树的索引模型,每个索引在InnoDB里面对应一棵B+树,索引类型一般主要分为主键索引(聚簇索引)和非主键索引(二级索引),一般在开发中推荐使用主键索引,因为使用非主键索引查询时存在回表的动作,相对于主键索引效率查询效率要低。
3、mysql支持最左前缀原则,举例:alter table emp add index ageNamIdx (name,age),创建这一复合索引进行分析,假如我们查询名字中包含“张”的员工,select * from emp where name like "张%",通过查看执行计划explain select * from emp where name like "张%" 我们发现使用了索引,这样我们就不需要单独为name字段新增索引,这样大大提高了索引的复用能力,减少了索引的维护。
4、mysql的索引下推,mysql在5.6之后加入了新特性:索引下推,mysql利用这一特性可以减少回表次数,加快查询效率。举例:查询名字中包含张,年龄10岁,并且姓别是男性的员工,查询语句:select * from emp where name like "张%" and age =10 and ismale=1;5.6之后,在索引遍历的过程中,对索引包含的字段先做判断,直接过滤掉不满足的条件的记录,减少回表次数,譬如:5.6之前,没有索引下推,根据非主键索引查出来10条数据那么需要回表10次,5.6之后,引入索引下推之后,根据非主键索引name、age查询数据已经过滤一部分数据剩下7条数据,那么这7条数据只需要回表7次,大大提升了查询效率。
5、mysql的索引是需要去维护的,B+树为了维护索引的有序性,在插入新值的时候要做必要的维护,假如索引页存的的数据记录是500、600、800,你插入的数据900只需要在后面追加即可,但是如果你插入的数据是700,mysql需要逻辑上移动后面的数据,空出位置,更糟的情况,如果页数据满了,根据B+树的算法会去重新申请一个数据页,然后挪动部分数据过去,这个过程称为页分裂,此时性能会受到影响,同理数据删除的过程,会触发页合并。
6、完整索引和前缀索引的选择:
直接创建完整索引,这样可能比较占用空间,查询效率客观;创建前缀索引,节省空间,但会增加查询扫描次数,并且不能使用覆盖索引,效率不如完整索引。



