拉不拉稀肚拉稀 发表于 2025-4-10 09:36:55

掌握Explain工具,让你的数据库性能翻倍提拔!

前言

使用 EXPLAIN 关键字可以模拟优化器实行 SQL 语句,分析你的查询语句或是结构的性能瓶颈,根据分析结果举行SQL语句优化达到更好的性能。
一、EXPLAIN是什么?

EXPLAIN 是 MySQL 用于分析 SQL 查询实行计划的工具,通过它可以了解优化器如那边理 实行SQL 语句,从而优化查询性能。
官网地址:https://dev.mysql.com/doc/refman/5.7/en/explain-output.html
二、使用方法

在 select 语句之前增加 explain 关键字 ,MySQL 会在查询上设置一个标记,实行查询会返回实行计划的信息,而不是实行这条 SQL,如下所示:
https://i-blog.csdnimg.cn/direct/903f8f548cba44e4a0e07250a4b9eaf4.png
三、分析EXPLAIN中的字段

Explain的紧张列及其含义:


[*]id:是 select 的序列号,有几个 select 就有几个 id,并且 id 的顺序是按 select 出现的顺序增长的。体现查询中表的顺序,id 列越大实行优先级越高,id 相同则从上往下实行,id 为 NULL 最后实行。
[*]select_type:体现查询的范例,如 SIMPLE(简单查询)、SUBQUERY(子查询)PRIMARY(复杂查询)等。
[*]table:体现当前操作的表。
[*]partitions:表现查询涉及的分区信息(如果表是分区表)。
[*]type:体现访问范例,从最优到最差依次为 system > const > eq_ref > ref > range > index > ALL。一般来说,得保证查询达到 range 级别,最好达到 ref。
[*]possible_keys:表现可能使用的索引。如果该列是 NULL,则没有相关的索引。在这种情况下,可以通过查抄 where 子句看是否可以创造一个适当的索引来进步查询性能,然后用 explain 查看效果。
[*]key:表现实际使用的索引。表现 mysql 实际采取哪个索引来优化对该表的访问。
[*]key_len:体现索引中使用的字节数。通过这个值可以算出具体使用了索引中的哪些列。
[*]ref:表现索引的哪一列被用于查找。
[*]rows:这一列是 mysql 估计要读取并检测的行数,注意这个不是结果集里的行数。
[*]filtered:体现表中匹配的行的百分比。
[*]Extra:包含额外的查询优化信息,如 Using index(使用覆盖索引)、Using filesort(需要额外排序)等。
关键分析点:


[*]type:避免 ALL(全表扫描),至少达到 range(范围扫描)。
[*]key:确认是否掷中索引,未掷中需优化。
[*]rows:数值过大可能需优化索引或查询条件。
[*]Extra:出现 Using temporary(临时表)或 Using filesort(文件排序)时需鉴戒性能标题。
四、索引的最佳实践


[*] 索引创建原则

[*]高频查询字段:为 WHERE、JOIN、ORDER BY、GROUP BY 中的列建索引。
[*]高选择性列:区分度高的列(如用户ID)优先,避免低选择性列(如性别)。
[*]复合索引顺序:将最常用且高选择性的列放在左侧,遵照最左前缀原则。
[*]覆盖索引:索引包含查询所需全部字段(如 SELECT a,b FROM table WHERE c=1,可建 (c,a,b))。

[*] 索引优化技巧

[*]避免冗余索引:如已有 (a,b),再建 (a) 则冗余。
[*]前缀索引:对长文本字段(如 VARCHAR(200))使用前缀(如 INDEX(col(10))),均衡性能与存储。

[*] 索引失效场景

[*]最左前缀缺失,如果索引了多列,要服从最左前缀法则。指的是查询从索引的最左火线开始并且不跳过索引中的列。
[*]不在索引列上做任何操作(计算、函数、(自动 or 手动)范例转换),会导致索引失效而转向全表扫描。
[*]存储引擎不能使用索引中范围条件右边的列,怎么理解就是如果有个团结索引(a,b,c),当我输出 select * from test where a=1 and b>5 and c=4此时索引 c 字段将不会使用索引。
[*]尽量使用覆盖索引:如果查询的列完全包含在索引中,MySQL 可以直接使用索引而无需回表,从而进步查询速度。减少 select * 语句
[*]mysql 在使用不便是(!=大概<>),not in ,not exists 的时间无法使用索引会导致全表扫描
[*]is null,is not null 一般情况下也无法使用索引
[*]like 以通配符开头(‘%张三’)mysql 索引失效会变玉成表扫描操作
[*]隐式范例转换,如 WHERE name = 123(name 为字符串范例),注意加单引号。
[*]避免使用 OR 或 IN:这些操作符可能导致 MySQL 不使用索引,大概需要拆分查询。

总结

以上就是今天要讲的内容,通过理解 EXPLAIN 输出并遵照索引最佳实践,可明显提拔查询性能,降低体系负载。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 掌握Explain工具,让你的数据库性能翻倍提拔!