之前的文章咱们已经简单介绍过索引了,这里就不再过多阐述了,感兴趣的可以自己去瞅一眼。那么咱们就直接切入正题!
索引失效
那什么是索引失效呢,怎样来定义它是失效的呢?
虽然你这列上建了索引,查询条件也是索引列,但最终执行计划没有走它的索引,没错,这就是索引的失效。
那么问题就又来了:你说它失效,那它究竟怎样会失效呢?
好的,那小生就给大家列举一些索引失效的例子,让大家看一下:
索引失效的场景:
(1)like以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。
(2)or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效
(3)组合索引,不是使用第一列索引,索引失效。
(4)数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型(用select查询时),使索引无效,产生全表扫描。
5)在索引列上使用 IS NULL 或 IS NOT NULL操作(在 where 子句中对字段进行 null 值判断)
(6)在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0。
(7)对索引字段进行计算操作、字段上使用函数。
(8)当全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效。
索引失效分析工具:
可以使用explain命令加在要分析的sql语句前面,在执行结果中查看key这一列的值,如果为NULL,说明没有使用索引。
当然了,说一部分的索引失效并不是说索引不好不要使用,反而对我们有极大的帮助,那它有什么好处呢?
索引的优缺点
优点:
通过创建唯一索引可以保证数据库表中每一行数据的唯一性。
可以给所有的 MySQL 列类型设置索引。
可以大大加快数据的查询速度,这是使用索引最主要的原因。
在实现数据的参考完整性方面可以加速表与表之间的连接。
在使用分组和排序子句进行数据查询时也可以显著减少查询中分组和排序的时间
缺点:
创建和维护索引组要耗费时间,并且随着数据量的增加所耗费的时间也会增加。
索引需要占磁盘空间,除了数据表占数据空间以外,每一个索引还要占一定的物理空间。如果有大量的索引,索引文件可能比数据文件更快达到最大文件尺寸。
当对表中的数据进行增加、删除和修改的时候,索引也要动态维护,这样就降低了数据的维护速度。
所以我们在使用索引时,需要综合考虑索引的优缺点。
索引可以提高查询速度,但是会影响插入记录的速度。因为,向有索引的表中插入记录时,数据库系统会按照索引进行排序,这样就降低了插入记录的速度,插入大量记录时的速度影响会更加明显。这种情况下,最好的办法是先删除表中的索引,然后插入数据,插入完成后,再创建索引。
各位看官,又到了十分不舍分别的时刻,咱们下次再见?
好吧,那咱们下次再见咯,不见不散!!!