繁体   English   中英

使用SUM时提高MySQL查询性能

[英]Improving MySQL query performance when using SUM

我有一个用户生成的内容表,其中包括用于状态的ENUM格式列。 (待定,已批准,自动批准或已拒绝)为了按状态关注最近内容的数量,我使用以下查询:

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没有索引。

仔细检查是否已索引适当的列。

(如编辑中所述,我无法仔细检查索引。对适当的列建立索引后,问题已解决。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM