优化 Mysql 查询
Posted
技术标签:
【中文标题】优化 Mysql 查询【英文标题】:Optimizing Mysql Queries 【发布时间】:2017-10-13 19:24:41 【问题描述】:我有两个 sql 查询,用不同的方法来得到答案。我想找到一列具有相同 emp_no 的最大次数。以下是这两个查询的解释。
查询一:
从中选择最大(计数) 选择计数(emp_no)作为计数 来自工资 GROUP BY emp_no 作为 t
查询二:
选择计数(emp_no)作为计数 来自工资 GROUP BY emp_no ORDER BY count(emp_no) DESC 限制 1 偏移量 0
表 +-----+------------+-------------+ |编号 | emp_no |工资 | +-----+------------+-------------+ | 1 | 00001 | 10000 | | 2 | 00002 | 20000 | | 3 | 00003 | 10000 | +-----+------------+-------------+
emp_no 具有唯一的 b 型树索引
这两个哪个更好?另外,请给我推荐一些好的阅读材料来学习优化技术。
【问题讨论】:
把表格和数据发成文字,不是每个人都能看到图片READ THIS 您是否测试过哪个查询运行得更快?关于优化最重要的是使用适当的索引。这是一个很好的材料mysql索引TIPS 在 MySQL 中,您可能还需要考虑分区。 dev.mysql.com/doc/refman/5.7/en/partitioning-overview.html @JuanCarlosOropeza 我运行了两个查询,他们花费的时间几乎相同。但是,当我使用解释查询 1 时,分别使用 2 select_type PRIMARY 和 DERIVED 类型的 all 和 index 以及额外的列 NULL 和 INDEX;查询 2 使用 1 个 INDEX 类型的 SIMPLE select_type,但在 EXTRA 中,它使用索引、文件排序和 temp 【参考方案1】:您的“查询 2”,
SELECT COUNT(*)
FROM Salaries
GROUP BY emp_no
ORDER BY 1 DESC
LIMIT 1;
写起来更短,速度更快。
如果Salaries
有INDEX(emp_no)
,则可以在索引的BTree 内执行查询。由于EXPLAIN
说“使用索引”,就是这种情况。它被称为“覆盖指数”。这个索引是可以加快查询速度的最好的(也可能是唯一的)东西。
EXPLAIN
并不完美。
LIMIT 1
的影响在EXPLAIN
中均未显示。
分区无济于事。
【讨论】:
以上是关于优化 Mysql 查询的主要内容,如果未能解决你的问题,请参考以下文章