最近项目的数据量比较大,使用了大量的索引,也查阅了网上众多的资料,发现网上各位仁兄说的信息都不太负责任,有很多人估计都没有做亲身试验,就发出来了。我最近做了一些试验,把试验结果总结了一下,发出来供自己和大家日后使用。

以下以mysql5.6.38为例子,总结的几点经验发出来

一、几点经验总结

1、数据库索引分单索引、联合索引之分。
2、SQL语句的每个查询,只会使用一个索引(包括单索引、联合索引)。
3、假设有两个单索引,你的检索条件中由这两个索引作为条件,那么mysql会以这两个索引数据量少的那个作为检索索引(起始数据库管理系统还是很聪明的)。
4、假设有两个单索引,同时这两个单索引也组成了联合索引,你的检索条件中由这两个索引作为条件,那么mysql会以联合索引作为检索索引。
5、假设由A,B,C组成了联合索引(联合索引有从左到右的命中原则),那么相当于形成A,B,C、A,B、A三个索引,单纯用B或者C作为检索条件是无法命中索引的,用B,C作为检索条件也是无法命中索引的。
6、因为索引是会加载到内存中的,索引追加过度,会导致内存吃不消的。

二、sql执行计划
以下通过explain显示出mysql执行的字段内容,关注possible_keys、key,尤其是关注key,如果key是null代表全表扫描,对于数据量大的表示万万不可的。

id: SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符.
select_type: SELECT 查询的类型.
table: 查询的是哪个表
partitions: 匹配的分区
type: join 类型

possible_keys: 此次查询中可能选用的索引
key: 此次查询中确切使用到的索引

ref: 哪个字段或常数与 key 一起被使用
rows: 显示此查询一共扫描了多少行. 这个是一个估计值.
filtered: 表示此查询条件所过滤的数据的百分比
extra: 额外的信息

三、索引失效

1、like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。
2、or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效。
3、组合索引,不是使用第一列索引,索引失效。
4、数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描。
5、在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0。
6、对索引字段进行计算操作、字段上使用函数,索引失效。
7、当全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效。