我正在使用一个数据库监控系统,除其他数据外,它还显示了 SELECT 查询的以下值:
- 在第一个表上使用范围的联接数
- 对第一个表进行全面扫描的连接数
- 没有键的连接数,在每行之后检查键的使用情况
- 由于不使用索引而执行表扫描的连接数
- 在引用表上使用范围搜索的联接数
在这些查询中,哪些查询性能最差,因此应该首先优化?我会按重要性顺序说#2 和#4,但我也想听听对其他类型的评论。
该监控系统还将 SELECT 查询的总数显示为这五个值的总和。对于 SELECT,这些真的都是可能的、互斥的情况吗?
我不是在谈论特定的查询(我可以在慢查询日志中找到);我对上面列出的这 5 个中的查询类型更感兴趣。例如,全表扫描通常是一件坏事(除非我们正在处理小表,在这种情况下我们不会关心优化)。
我的另一个问题是这些类型是否可能重叠,因为监控系统显示的第 6 个值是这五个值的总和,如果这些类型不相互排斥(正如我们怀疑的那样),这就没有意义。
以上都不是。
如果表只有 10 行,则“完全扫描”是无关紧要的。同上“不使用索引”。
有许多查询没有索引是有用的;您的统计数据会让您绊倒它们。例如,如果您索引一个“标志”(是/否、M/F 等),优化器通常会避开索引并简单地扫描表——因为这样做效率更高。
“第一张桌子”。除非您正在查看
EXPLAIN
,否则很难预测将“首先”查看哪个表。即使 的存在LEFT
也不能最终预测表的排序。无论如何,你的目标是什么?在我看来,主要目标是找到并修复使系统陷入困境的查询。为此,我想要一个查询列表,按总经过时间(出现次数乘以平均时间)排序。一个非常有效地提供的
然后,我得到
EXPLAIN
并SHOW CREATE TABLE
处理前几个查询并处理它们。如果你想看到“随时间变化”,那么记录最差查询的“总时间”,看看下个月这些查询会变得更好还是更糟。
您可能会发现一些最糟糕的查询不是
SELECTs
.