优化 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;

写起来更短,速度更快。

如果SalariesINDEX(emp_no),则可以在索引的BTree 内执行查询。由于EXPLAIN 说“使用索引”,就是这种情况。它被称为“覆盖指数”。这个索引是可以加快查询速度的最好的(也可能是唯一的)东西。

EXPLAIN 并不完美。

Q#2 说“使用临时”和“使用文件排序”。但这并不像听起来那么糟糕。 Q#1 显示两行 - 但每行表示 280 万行。 LIMIT 1 的影响在EXPLAIN 中均未显示。

分区无济于事。

【讨论】:

以上是关于优化 Mysql 查询的主要内容,如果未能解决你的问题,请参考以下文章

MySql性能优化查询优化

mysql多条件查询的优化

mysql查询优化器应该怎么使用

MySQL查询优化器工作原理解析

mysql优化之查询优化

mysql查询优化策略