优化Mysql查询

时间:2017-10-13 19:24:41

标签: mysql sql query-optimization

我有两个sql查询,有不同的方法来得到答案。我想找到列具有相同emp_no的最大时间。以下是两个查询中每个查询的EXPLAIN。

查询一个:

enter image description here

SELECT MAX(计数)FROM {
SELECT count(emp_no)按计数
    来自工资GROUP BY emp_no
} t t

查询二:

SELECT count(emp_no)as count
    来自工资GROUP BY emp_no
    ORDER BY count(emp_no)DESC
限制1 OFFSET 0

enter image description here


+ ----- + ------------ + ------------- +
| id | emp_no |工资|
+ ----- + ------------ + ------------- +
| 1 | 00001 | 10000 |
| 2 | 00002 | 20000 |
| 3 | 00003 | 10000 |
+ ----- + ------------ + ------------- +

\ temp_no具有唯一

类型b树的索引

两者中的哪一个会更好?另外,请向我推荐一些很好的阅读材料来学习优化技巧。

1 个答案:

答案 0 :(得分:0)

您的"查询2",

SELECT COUNT(*)
    FROM Salaries
    GROUP BY emp_no
    ORDER BY 1 DESC
    LIMIT 1;

写得更短,速度更快。

如果SalariesINDEX(emp_no),则可以在索引的BTree内执行查询。由于EXPLAIN说"使用索引",情况就是这样。它被称为"覆盖索引"。该索引是可以加速查询的最佳(也可能是唯一的)。

EXPLAIN并不完美。

  • Q#2说"使用临时"和#34;使用filesort"。但它并没有听起来那么糟糕。
  • Q#1显示两行 - 但每行表示2.8M行。
  • LIMIT 1的影响未在EXPLAIN中显示。

分区无济于事。