如何玩转别人的sql是否执行高效呢,今天我们就分析一下索引的使用。
在大数据量数据库中,我们写出来的sql是否走索引了呢。如何你不知道,你写出来的sql可抗自己哦。
下面我们就直接开始演示如何把自己写的sql是否走索引了
1. explain+sql
explain select * from table_name where id=1
结果:
注释:
1.1 id
标志这个sql语句被分为几个(行数)独立的sql执行,执行顺序依照(1)从大到小(2)从上到下 依次排列执行;即select识别符,select的查询序列号。
1.2 select_type
查询类型
SIMPLE 简单的select查询,查询中不包含子查询或者UNION
PRIMARY 查询中包含子查询,其中最外层查询为PRIMARY
SUBQUERY
别的查询语句(select或where)中的子查询
DERIVED 在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放在临时表中 ,临时表
UNION 若第二个SELECT出现在UNION之后,则被标记为UNION:若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED
UNION RESULT UNION的结果
1.3 table
表名
1.4 type
表示查询用到了那种索引类型
system 表中只有一条记录,一般来说只在系统表里出现。
const 表示通过一次索引查询就查询到了,一般对应索引列为primarykey 或者unique where语句中 指定 一个常量,因为只匹配一行数据,MYSQL能把这个查询优化为一个常量,所以非常快。
eq_ref 唯一性索引扫描。此类型通常出现在多表的 join 查询,对于每一个从前面的表连接的对应列,当前表的对应列具有唯一性索引,最多只有一行数据与之匹配。
ref 非唯一性索引扫描。同上,但当前表的对应列不具有唯一性索引,可能有多行数据匹配。此类型通常出现在多表的 join 查询, 针对于非唯一或非主键索引, 或者是使用了 最左前缀 规则索引的查询.
range 索引的范围查询。查询索引关键字某个范围的值
index 全文索引扫描。与all基本相同,扫描了全文,但查询的字段被索引包含,故不需要读取表中数据,只需要读取索引树中的字段。
all 全文扫描。未使用索引,效率最低。
1.5 ref
显示索引的哪一列被使用了
ref 显示使用哪个列或常数与key一起从表中选择行。在eq_ref 与ref中才不为null。
如果是使用的常数等值查询,这里会显示const,如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段,如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func
1.6 rows
MySQL 查询优化器根据统计信息, 估算 SQL 要查找到结果集需要扫描读取的数据行数 这个值非常直观显示 SQL 的效率好坏, 原则上 rows 越少越好
1.7 key 和 possible key 与 key_len
possible key 表示 MySQL 在查询时, 能够使用到的索引. 注意, 即使有些索引在 possible_keys 中出现, 但是并不表示此索引会真正地被 MySQL 使用到. MySQL 在查询时具体使用了哪些索引, 由 key 字段决定.
key 显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL。
key_len 显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。
1.8 extra
额外信息
Using Filesort 表示对结果排序时无法使用索引,使用了一个临时索引对结果排序。
Using Temporary 在查询中使用了临时表保存中间结果。
Using Index 表示使用了覆盖索引, 如果同时出现了Using Where 表示索引被同时用来查找对应的键,若未出现,则仅仅用来读取数据。
Using Join Buffer 表示在查询的时候 Join使用的非常多,使用了连接缓存,可以在配置文件中把缓冲区的join buffer调大一点。
Using where 使用了where
Impossible where where后的值总是false 比如 (...where i=1 and i=2)
distinct 优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作
1.9 filtered
显示了通过条件过滤出的行数的百分比估计值。
3. 查看索引
4. 删除索引