必答内容:
好的,我们知道索引确实可以提高查询的效率,但前提是需要针对于数据库表创建合适的索引。创建索引的时候主要考虑一下几点原则:
1).针对于数据量较大,且查询比较繁琐的表创建索引。(单表超过10w记录)
2).针对于经常作为查询条件(where)、排序(orderby)、分组(group by)操作的字段建立素引。
3).尽星选择为区分度高的列建立索引,如果该字段是唯一的,建立唯一素引,效率更高。(区分度越高,效率越高)。
4).在varchar类型的字段上,建议指定索引长度(建立前缀素引),没必要对全字段建立索引,根据实际文本区分度决定素引长度就可以。
5).尽量建立联合素引,而且在联合素引中将区分度高的字段放在前面,减少单列素引。(查询时,联合素引很多时候可以素引覆盖,避免回表,提高效率)
6).在满足业务需求的前提下,建立适当的素引,索引不宜过多。(素引过多,会增加维护素引的成本,影响增制改的效率)
。可能会继续发问的问题:
1).索引的创建只是第一步,要想提高查询效率,还得正确的使用素引,避免素引失效,你知道素引失效的场景吗?【参照 3.2]
3.2 简单聊聊索引失效的场景 ?
·必答内容:
好的,素引失效这个问题,确实是在项目开发中非常常见的一类问题。那我就结合我之前的项目经验来聊一下,之前遇到的一些索引失效的场景:
第一类呢,就是在联合索引使用的时候,违反最左前缀法则,比如查询的条件并不是从索引最左边的列开始的。
第二类呢,就是范围查询(非等值查询)右侧的列,不能使用素引。
第二类呢,就是在索引列上进行运算或函数操作,索引将失效。非常典型的,像我们基于substring这样的函数载取字段值。
以及如果在条件匹配时,需要进行隐式类型转换的时候。比如:where gender=1,而gender是char类型这种字符串不加引号,虽然查也能查出来,但也会造成索引失效。
还有像常见的,以 %开头的like模糊匹配,索引也会失效。
当然这样的场景很多啊,上面这几个只是比较常见的索引失效的场景,所以在项目开发中,编写SQL时,就要避免这些情况的发生。
进阶内容:零
而对于索引是否生效,到底走哪个素引,以及具体SQL语句的执行性能到底怎么样。 这个我们可以借助于explain 来查看sql语句的执行计划,具体问题具体分析。
我们可以通过explain执行计划中的 key 来确定此次查询是否使用了索引,以及通过 type 来判定SQL的执行性能定要规避 type 为all全表扫描的情况,还有像 extra 的信息也需要关注一下。