MySQL如何查看SQL查询是否用到了索引?explain使用 type和 possible_keys以及key

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

  • https://blog.csdn.net/qq_27198345/article/details/116382587

1. 概述 explain

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

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

explain
v.
解释,说明;说明(……的)原因,解释(……的)理由

2. 实践

2.1 建表

例如,如下的数据表

use test;

drop table if exists `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.2 对比加索引前后的SQL查询情况

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

未使用索引

SQL查询 address 为北京市的人:

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jl8lk421-1687672013483)(D:\Project\test\interview-and-live\MySql\索引\图片\未使用索引.png)]

1	SIMPLE	student		ALL					17	11.11	Using where
  • 未加索引之前,扫描了17行,type为ALL,匹配度只有11.11
添加索引后

在 student 表上加索引:

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

img

为了加快索引,我们采用前缀索引,因为

  • 一个汉字在UTF-8编码下占3个字节,因此选择对address字段的前9位加索引。

再次执行上面的SQL查询语句

img

id为1
查询类型为 简单
表为 学生
类型为 ref

可能的键为:name_index1 (自己加的索引)
Key为:name_index1

key长度为:152
连接为:const
rows行为:6行
过滤比为:100%
扩展为:使用了索引
1	SIMPLE	student		ref	name_index1	name_index1	152	const	1	100.00	Using index



explain select name FROM student WHERE id > 1

可能的keysPRIMARY,name_index1
使用的索引:PRIMARY

2.3 解释Explain得到的结果

1) type 反应查询语句的性能 range ref

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

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

system > const > eq_ref > ref > fulltext > 

ref_or_null > index_merge > unique_subquery > index_subquery > 

range > index > ALL

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

range
英
/reɪndʒ
n.
(变动或浮动的)范围,界限;视觉(或听觉)范围;射程,射击距离;一系列;成套产品,
v.
(在一定的范围内)变化,变动;(按一定位置或顺序)排列,排序;徘徊,四处移动;
adj.
<文>(生活方式)有秩序的,安定的
2) possible_keys: SQL查询时用到的索引。

可以看到,没加索引时,possible_keys 的值为 NULL

  • 加了索引后的值为 address,即用到了索引address(索引默认为(column_list)中的第一个列的名字).
3) key 显示SQL实际决定查询结果使用的键(索引)。

如果没有使用索引,值为NULL

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

  1. rows 显示MySQL认为它执行查询时必须检查的行数
  • 可以看到,没加索引时,rows 的值为17,即数据表student中所有数据,说明没加索引时的SQL查询是全表扫描;

  • 加了索引后,rows 的值为6,数据库表中address以“北京市”开头的一共也就6条,SQL在执行查询操作时,一共也检查了6行,不必进行全表扫描查询,

    • 可以很容易得出结论:加索引的SQL查询性能远高于不加索引的情况。
  1. 总结
    通过在SQL查询语句前面添加关键字 explain 就可以分析SQL查询语句的性能了.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL索引数据库中的一个重要概念,它能够提高查询效率。索引的优化可以大大提高查询性能,减少数据库的负载。在MySQL中,我们可以通过EXPLAIN命令来查看SQL查询是否命中索引。 举例说明: 假设有一个学生表,字段包括id、name、age、sex、class等。我们需要查询年龄为18岁的学生信息,SQL语句如下: SELECT * FROM student WHERE age = 18; 为了优化查询效率,我们可以为age字段添加索引SQL语句如下: ALTER TABLE student ADD INDEX age_idx(age); 再次执行查询语句时,我们可以通过EXPLAIN命令来查看是否命中索引SQL语句如下: EXPLAIN SELECT * FROM student WHERE age = 18; 执行结果如下: +----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------------+ | 1 | SIMPLE | student | NULL | ref | age_idx | age_idx | 5 | NULL | 10 | 100.00 | Using where | +----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------------+ 可以看到,type列显示为ref,表示使用索引。如果没有命中索引type列可能显示为ALL或Using filesort等,查询效率会非常低。 在实际开发中,我们可以根据需要为表的关键字段添加索引,但过多的索引也会影响数据库的性能。因此,需要根据实际情况进行合理的索引优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值