如何看mysql sql查询语句用了哪些索引?如何分析查询语句?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何看mysql sql查询语句用了哪些索引?如何分析查询语句?相关的知识,希望对你有一定的参考价值。

参考技术A

运行explain + SQL语句,例如:

explain select * from students where phone like '45%'\\G

图中

possible_keys:可能被利用的索引名

key:被利用的索引名

rows:扫描的行数,1表示只扫描了一行说明充分利用了索引,此数自然越少越好

还有查询耗时等等都可为查询语句效率分析提供参数依据

MySQL如何查看SQL查询是否用到了索引?


索引 是提高MySQL查询性能的非常有用的一个工具,当我们对数据库中的某些字段建立了索引,那么怎么查看在执行的SQL查询的过程中是否用到了这些索引呢?

查询SQL语句的执行情况通常通过关键字 explain 来进行.

1. 建表

例如,如下的数据表

use test;

drop if exists table `student`;
create table `student`
(
  `id`      int not null auto_increment,
  `name`    varchar(50) not null,
  `number`  varchar(20) not null,
  `address` varchar(100),
  `age`     int default 0,
  primary key (`id`)
)Engine=InnoDB DEFAULT CHARSET=utf8;

insert into student (`name`, `number`, `address`, `age`)
values
("马云", "18000001", "浙江省杭州市余杭区", 55),
("马化腾", "18000002", "广东省深圳市南山区", 50),
("张一鸣", "18000003", "北京市海淀区", 38),
("王兴", "18000004", "北京市朝阳区", 40),
("李彦宏", "18000005", "北京市海淀区", 45),
("程维", "18000006", "北京市海淀区", 42),
("雷军", "18000007", "北京市朝阳区", 54),
("刘备", "18000008", "四川省成都市青羊区", 60),
("诸葛亮", "18000009", "四川省成都市武侯区", 43),
("关羽", "18000010", "湖北省荆州市荆州区", 58),
("张飞", "18000011", "四川省阆中市", 56),
("曹操", "18000012", "河南省洛阳市老城区", 63),
("孙权", "18000013", "江苏省南京市建邺区", 49),
("李世民", "18000014", "陕西省西安市长安区", 38),
("李隆基", "18000015", "陕西省西安市长安区", 28),
("朱元璋", "18000016", "江苏省南京市玄武区", 61),
("朱棣", "18000017", "北京市东城区", 39);

2. 对比加索引前后的SQL查询情况

EXPLAIN 关键字查看SQL查询过程的情况:

SQL查询 address 为北京市的人:

explain select name, address from student where address like "北京市%";

在这里插入图片描述
student 表上加索引:

alter table student add index (address(9));

在这里插入图片描述
为了加快索引,我们采用前缀索引,因为一个汉字在UTF-8编码下占3个字节,因此选择对address字段的前9位加索引。

再次执行上面的SQL查询语句:
在这里插入图片描述

3. 解释Explain得到的结果

3.1 type 反应查询语句的性能

我们主需要注意一个最重要的的 type 的信息很明显地体现出是否用到了索引:

type 结果值从好到坏依次是:

system > const> eq_ref> ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般来说,得保证查询至少达到 range 级别,最好能达到 ref 级别,否则就可能出现性能问题。

3.2 possible_keys: SQL查询时用到的索引。

可以看到,没加索引时,possible_keys 的值为 NULL,加了索引后的值为 address,即用到了索引address(索引默认为(column_list)中的第一个列的名字).

3.3 key 显示SQL实际决定查询结果使用的键(索引)。如果没有使用索引,值为NULL

可以看到,没加索引时,key 的值为 NULL,加了索引后的值为 address,即决定查询结果用到了索引address

3.4 rows 显示MySQL认为它执行查询时必须检查的行数

可以看到,没加索引时,rows 的值为17,即数据表student中所有数据,说明没加索引时的SQL查询是全表扫描;

加了索引后,rows 的值为6,数据库表中address以“北京市”开头的一共也就6条,SQL在执行查询操作时,一共也检查了6行,不必进行全表扫描查询,可以很容易得出结论:加索引的SQL查询性能远高于不加索引的情况。

总结

通过在SQL查询语句前面添加关键字 explain 就可以分析SQL查询语句的性能了.

参考
mysql 如何查看sql查询是否用到索引

以上是关于如何看mysql sql查询语句用了哪些索引?如何分析查询语句?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL优化之索引篇: Explain工具

从哪些方面优化网站

mysql如何查询SQL中哪些语句执行最占用CPU?

Mysql explain

MySQL调优之EXPLAIN关键字

MySQL索引使用限制都有哪些