优点
- 大大减少了服务器需要扫描的数据量,大大加快数据的检索速度,这也是创建索引的最主要的原因
- 帮助服务器避免排序和临时表
- 将随机io变成顺序io
通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能
缺点
创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加
- 索引也需要占空间,我们知道数据表中的数据也会有最大上线设置的,如果我们有大量的索引,索引文件可能会比数据文件更快达到上线值
- 当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度。
更新会变更B+树,更新频繁的字段建议索引会大大降低数据库性能
由此可见,索引并不是越多越好。
- 更新十分频繁,数据区分度不高的字段上不宜建立索引
- 数据量小的表最好不要使用索引,因为由于数据较少,可能查询全部数据花费的时间比遍历索引的时间还要短,索引就可能不会产生优化效果
- 在一同值少的列上(字段上)不要建立索引,比如在学生表的”性别”字段上只有男,女两个不同值。相反的,在一个字段上不同值较多可是建立索引
- 一般区分度在80%以上的时候就可以建立索引,区分度可以使用 count(distinct(列名))/count(*) 来计算
索引的用处
- 快速查找匹配WHERE子句的行
- 从consideration中消除行,如果可以在多个索引之间进行选择,mysql通常会使用找到最少行的索引
- 如果表具有多列索引,则优化器可以使用索引的任何最左前缀来查找行
- 当有表连接的时候,从其他表检索行数据
- 查找特定索引列的min或max值
- 如果排序或分组时在可用索引的最左前缀上完成的,则对表进行排序和分组
-
索引失效的场景
like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。(最左原则)
- or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效。
- 组合索引,不是使用第一列索引,索引失效。(最左原则)
- 数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描。
- 在索引列上使用 IS NULL 或 IS NOT NULL操作,索引可能会失效但不一定失效。
- 在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0。
- 对索引字段进行计算操作、字段上使用函数。
- 当全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效。
- 索引列结果集大于总数据的2/3时,索引失效。原因即上面的第8点。比如性别sex=0|1,共30条数据,=0的有21条,此时你查询
** where sex=0 **则不走索引。
经过朕的亲测 is null 和 is not null 都是走索引的,mysql数据库版本为5.7
