“携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情
对上百万的数据集进行检索,检索速度一般都不尽如人意。例如一个简单的检索耗费时长0.7s,添加索引后,速度提升到0.00054s。
添加索引的时候可以使用explain
关键字查看索引信息。
mysql> explain select * from user where project_id = 11 and group_id = 13 and is_deleted = 0\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: user
partitions: NULL
type: ref
possible_keys: project_group
key: project_group
key_len: 17
ref: const,const
rows: 59
filtered: 10.00
Extra: Using where
1 row in set, 1 warning (0.00 sec)
对以上出现的列进行解析:
1、id
select 查询的系列号,表示查询中执行 select 子句或操作表的顺序。
1. id相同,执行顺序从上到下
2. id不同,如子查询,id的序号会递增,`id的值越大优先级越高,越先被执行`
3. id相同不同都有,`id值越大越先被执行,相同从上到下顺序执行`
2、select_type
select_type表示的执行计划的对应的查询是什么类型,常见的查询类型主要包括普通查询、联合查询以及子查询等。SIMPLE(查询语句为简单的查询不包含子查询)、PRIMARY(当查询语句中包含子查询的时候,对应最外层的查询类型)、UNION(union之后出现的select语句对应的查询类型会标记此类型)、SUBQUERY(子查询会被标记为此类型)、DEPENDENT SUBQUERY(取决于外面的查询 )
3、table
table代表表名称,表示要查询哪张表。当然不一定是真实的表的名称,也可能是表的别名或者临时表。
4、partitions
partitions代表的是分区的概念,表示在进行查询时,如果对应的表都会死分区表,那么这里就会显示具体的分区信息。
5、type
type是非常核心的属性,需要重点掌握。它表示的是当前通过什么样的方式对数据库表进行分访问。 (1)system
该表只有一行(相当于系统表),数据量很小,查询速度很快,system是const类型的特例。
(2)const
如果type是const,说明在进行数据查询的时候,命中了primary key或唯一索引,此类数据查询速度非常快。 (3)eq_ref
在进行数据查询的过程中,如果SQL语句中在表连接情况下可以基于聚簇索引或者非null值的唯一索引记性数据扫描,那么此时type对应的值就会显示为eq_ref。
(4)ref
数据查询的时候如果命中的索引是二级索引不是唯一索引,测试查询速度也会很快,但是type是ref。另外如果是多字段的联合索引,那么根据最左匹配原则,从联合索引的最左侧开始连续多个列的字段进行等值比较也是ref的类型。 (5)ref_or_null
这种连接类型类似于 ref,区别在于 MySQL会额外搜索包含NULL值的行。
(7)unique_subquery
在where条件中的关于in的子查询条件集合
(8)index_subquery
区别于unique_subquery,用于非唯一索引,可以返回重复值。
(9)range
使用索引进行行数据检索,只对指定范围内的行数据进行检索。换句话说就是针对一个有索引的字段,在指定范围中检索数据。在where语句中使用 bettween...and、<、>、<=、in 等条件查询 type 都是 range。 (10)index
Index 与ALL 其实都是读全表,区别在于index是遍历索引树读取,而ALL是从硬盘中读取。
(11)all
遍历全表进行数据匹配,此时的数据查询性能最差。
6、possible_keys
表示哪些索引可以被Mysql的优化器进行选择,也就是索引候选者有哪些。
7、key
在possible_keys中实际选择的索引
8、key_len
显示索引字段中使用的最大可能的字节数,并非实际的长度,可通过该参数计算查询中使用的索引长度,在不损失精确性的情况下,长度越短越好,
9、ref
显示哪些索引列或常量被引用了,优先 const,
10、rows
根据表统计信息及索引选用情况,大致估算出所优化的行数,越少越好
11、filtered
filtered 这个是一个百分比的值,表里符合条件的记录数的百分比。简单点说,这个字段表示存储引擎返回的数据在经过过滤后,剩下满足条件的记录数量的比例。
12、extra
在其他列不显示额外信息在此列进行展示。
(1)Using index
在进行数据查询的时候,数据库使用了覆盖索引,就是查询的列被索引覆盖,使用到覆盖索引查询速度会非常快。不是使用select * ,而是使用select phone_number,就会用到覆盖索引。 (2)Using where
查询时未找到可用的索引,进而通过where条件过滤获取所需数据,但要注意的是并不是所有带where语句的查询都会显示Using where。 (3)Using temporary
表示查询后结果需要使用临时表来存储,一般在排序或者分组查询时用到。
(4)Using filesort
此类型表示无法利用索引完成指定的排序操作,也就是ORDER BY的字段实际没有索引,因此此类SQL是需要进行优化的。