1、索引列值为null,此时会索引失效。
2、sql的语句中写了or,如果or后的字段不全是带索引字段,此时索引失效。
3、模糊查询是like以%XX开头,就是说左模糊不太行,右模糊可以。
4、存在类型转换,比如你的索引字段是varchar型,但是你搜索条件却是userid=333,那这样索引不生效。
5、数据量极少时,Mysql不会使用索引,因为全表扫描速度更快。
6、where条件中的索引运算设计计算时,索引失效。索引列不要使用函数。
首先我们还是先把表结构说下:用户表tb_user结构如下:
1、 不要在索引列上进行运算 *** 作, 索引将失效。
手机号phone字段有唯一索引,当根据phone字段进行函数运算 *** 作之后,索引失效:
2、 字符串类型字段使用时,不加引号,索引将失效。
如果字符串不加单引号,对于查询结果,没什么影响,但是数 据库存在隐式类型转换,索引将失效。
3、 如果仅仅是尾部模糊匹配,索引不会失效。如果是头部模糊匹配,索引失效。
接下来,我们来看一下这三条SQL语句的执行效果,查看一下其执行计划:
由于下面查询语句中,都是根据profession(专业)字段查询,profession字段是一个普通的索引, 我们主要看一下,模糊查询时,%加在关键字之前,和加在关键字之后的影响。
经过上述的测试,我们发现,在like模糊查询中,在关键字后面加%,索引可以生效。而如果在关键字 前面加了%,索引将会失效。
4、 用or分割开的条件, 如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会 被用到。
由于age没有索引,所以即使id有索引,索引也会失效。所以需要针对于age也要建立索引。
5、 数据分布影响:如果MySQL评估使用索引比全表更慢,则不使用索引。
MySQL的没有执行计划失效,可能是因为查询中用到的表已经发生变动,导致旧的执行计划失效,例如表重新索引,添加/修改字段,清空或者重建表等。另外,MySQL也有缓存执行计划,只要查询语句没有变化,当MySQL有新的查询语句需要执行时,会从缓存中调取执行计划。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)