mysql的EXPLAIN解释则怎么看,怎么针对优化

EXPLAIN是MySQL用于分析SELECT语句执行计划的一条非常有用的命令。通过它,你可以看到MySQL如何使用索引、连接表等,来执行你的查询。这个工具经常被用于优化查询性能。

在你的查询语句前添加EXPLAIN,MySQL将返回一张表,展示了关于查询如何执行的详细信息,例如:EXPLAIN SELECT * FROM my_table WHERE id = 10;。

下面是EXPLAIN输出的一些关键列,以及它们如何对应于查询优化:

id: SELECT查询的标识符,SELECT查询序列号。
select_type: 查询的类型,例如,SIMPLE(简单查询,不使用表连接或子查询)、PRIMARY、SUBQUERY等。
table: 输出数据行的表名。
type: 关联类型(从最好到最坏):system > const > eq_ref > ref > range > index > ALL。常见的优化就是尽量避免ALL(全表扫描)。
possible_keys: 可能被该查询使用的索引。
key: 实际上使用的索引。
key_len: 使用的索引长度。较短的值通常越好,因为它说明只使用了很少的字节来查找行记录。
ref: 显示索引的哪一列被使用了,可以是一个常数。
rows: 查询执行过程中需要检查的行数估计值。行越少越好,表示查询效率高。
Extra: 包含不适合放在其他列的重要信息,比如“Using index”说明了索引被用来直接从索引树过滤数据而不回表。“Using file sort”表明MySQL将使用外部索引排序而不是索引本身。“Using temporary”意味着MySQL在对查询结果排序和分组时将使用临时表。
针对优化的一些策略:

避免全表扫描:查看type列,优化查询以避免ALL和index(全索引扫描)。
使用索引:如果possible_keys显示有索引可以用,但key列却为空,考虑重新构造查询或创建合适的索引。
优化复杂查询:对于复杂的查询,如子查询、JOIN操作,select_type列应避免DEPENDENT SUBQUERY类型的查询,因为这意味着对每个结果集都要重新执行子查询。
行数估计:rows列告诉你每次查询有多少行被检查,这个数应该尽可能地小。
查看Extra列的详细信息:如果出现“Using file sort”或“Using temporary”,考虑修改查询或表结构,使用索引来优化排序和分组。
优化JOINs:如果查询涉及JOIN多个表,检查是否每个JOIN都是在type列显示了合理的关联类型。
使用EXPLAIN的最佳实践是运行它,然后根据提供的信息逐步改进查询,这可能涉及到重新编写查询,或者修改数据库设计,比如添加、删除或更改索引。在这个过程中应当结合实际应用情况,实验不同的优化策略,并监控它们对性能的实际影响。

mysql的Using file sort是不是俗称的回表
不,Using filesort和回表是两个不同的概念,在MySQL执行计划中分别代表不同的操作。

Using filesort
Using filesort是MySQL用来进行排序操作的术语,不一定意味着MySQL将使用物理文件进行排序,它可能在内存中完成,只有在需要排序的数据集大于可用内存时才会涉及到磁盘读写。Using filesort通常出现在EXPLAIN的输出中,意味着MySQL将对结果集进行排序,但是这次排序无法通过索引来优化。

排序通常发生在以下情况:

使用了ORDER BY子句,而被排序的列没有相应的索引可以直接利用,或者用于排序的索引顺序和ORDER BY的顺序不匹配。
对结果集应用了GROUP BY,但没有适用的索引进行排序。
回表(Using index condition / Using index)
另一方面,“回表”是指在查询过程中使用了二级索引(也叫辅助索引)来检索行的主键,然后再用这个主键去聚簇索引(也就是包含了数据行的实际数据的主键索引)中检索完整的数据行的过程。在EXPLAIN中,回表通常不是直接以"回表"的词汇出现,但当你看到Extra列中出现了Using index condition时,就意味着发生了回表操作以检索全行数据。

回表通常出现在以下情况:

查询依赖于二级索引,但需要从数据行中获取不在索引中的列信息。
当你的查询想获取的列不完全被索引所覆盖,即使使用了索引进行查找。
总的来说,“Using filesort”与排序操作有关,而“回表”与索引查找及全行数据获取有关,两者分别影响了MySQL查询性能的不同方面。

  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值