使用 SUM 时提高 MySQL 查询性能

Posted

技术标签:

【中文标题】使用 SUM 时提高 MySQL 查询性能【英文标题】:Improving MySQL query performance when using SUM 【发布时间】:2011-12-22 17:30:20 【问题描述】:

我有一个用户生成的内容表,其中包含用于状态的 ENUM 格式列。 (Pending、Approved、Approved-auto 或 Rejected)为了按状态关注最近内容的数量,我使用以下查询:

mysql> SELECT DATE(dt_submitted) AS date, 
              COUNT(*) AS count,
              SUM(IF(status='Approved', 1, 0)) as approved,
              SUM(IF(status='Approved-auto', 1, 0)) as approved_auto,
              SUM(IF(status='Rejected', 1, 0)) as rejected,
              SUM(IF(status='Pending', 1, 0)) as pending
       FROM post
       WHERE dt_submitted > DATE_SUB(CURDATE(), INTERVAL 30 DAY)
       GROUP BY date;
+------------+-------+----------+---------------+----------+---------+
| date       | count | approved | approved_auto | rejected | pending |
+------------+-------+----------+---------------+----------+---------+
| 2011-11-22 |   131 |      124 |             0 |        7 |       0 | 
| 2011-11-23 |   116 |      114 |             0 |        2 |       0 | 
...
| 2011-12-21 |   690 |      674 |             5 |       11 |       0 | 
| 2011-12-22 |    80 |       75 |             0 |        4 |      38 | 
+------------+-------+----------+---------------+----------+---------+
31 rows in set (0.60 sec)

这几乎是完美的,但我很挑剔,想看看我能不能让它更快。 (这台服务器上 0.6 秒很慢,而且表格更改过于频繁,无需担心将静态日期传递给缓存结果。)

如果我解释查询,它没有使用任何索引(status 已编入索引)。 (这是因为它指的是为 SUM 创建的临时表吗?)

explain SELECT DATE(dt_submitted) AS date, COUNT(*) AS count, SUM(IF(status='Approved', 1, 0)) as approved, SUM(IF(status='Approved-auto', 1, 0)) as approved_auto, SUM(IF(status='Rejected', 1, 0)) as rejected, SUM(IF(status='Pending', 1, 0)) as pending FROM post WHERE dt_submitted > DATE_SUB(CURDATE(), INTERVAL 30 DAY)  GROUP BY date;
+----+-------------+-------+------+---------------+------+---------+------+--------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows   | Extra                                        |
+----+-------------+-------+------+---------------+------+---------+------+--------+----------------------------------------------+
|  1 | SIMPLE      | post  | ALL  | NULL          | NULL | NULL    | NULL | 529902 | Using where; Using temporary; Using filesort | 
+----+-------------+-------+------+---------------+------+---------+------+--------+----------------------------------------------+
1 row in set (0.00 sec)

那么我能做些什么来优化表或重写查询以加快速度吗?还是这个查询只是受限于可用系统资源的速度?

编辑:dt_submitted 未编入索引。

【问题讨论】:

你能发布你的索引创建语句吗? 天哪,我是个白痴。当我看到 dt_submitted 实际上没有被索引时,正要发布 SHOW CREATE。创建索引将时间缩短到 0.1 秒。 (现在我应该删除这个问题,或者我如何最好地处理它?) 为问题创建答案 【参考方案1】:

仔细检查相应的列是否已编入索引。

(如编辑中所述,我没有仔细检查我的索引。一旦我索引了相应的列,问题就解决了。)

【讨论】:

以上是关于使用 SUM 时提高 MySQL 查询性能的主要内容,如果未能解决你的问题,请参考以下文章

如何提高查询性能?

如何提高MYSQL查询的性能?

提高Mysql查询性能

提高mysql查询的性能

将数据从 EBS 移动到临时存储会提高 MySQL 查询性能吗?

如何提高这个 MySQL 查询的性能?