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

文章目录

  • 前言
  • 一、EXPLAIN是什么?
  • 二、使用方法
  • 三、分析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,如下所示:
掌握Explain工具,让你的数据库性能翻倍提升!_第1张图片

三、分析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(文件排序)时需警惕性能问题。

四、索引的最佳实践

  1. 索引创建原则

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

    • 避免冗余索引:如已有 (a,b),再建 (a) 则冗余。
    • 前缀索引:对长文本字段(如 VARCHAR(200))使用前缀(如 INDEX(col(10))),平衡性能与存储。
  3. 索引失效场景

    • 最左前缀缺失,如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。
    • 不在索引列上做任何操作(计算、函数、(自动 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 为字符串类型),注意加单引号。
    • 避免使用 ORIN:这些操作符可能导致 MySQL 不使用索引,或者需要拆分查询。

总结

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

你可能感兴趣的:(架构学习,数据库,android,adb)