Mysql查询占用了太多时间

时间:2017-05-02 04:51:28

标签: php mysql sql

我在我的sql中使用查询。首先我用了

SELECT
    FROM_UNIXTIME(`points`.`timestamp`, '%Y-%m-%d') AS `date`,
    (SELECT  COALESCE(SUM(`points`.`votes`),0) FROM `points`
     WHERE `type` = 1 AND `server_id` = 24 AND
           FROM_UNIXTIME(`points`.`timestamp`, '%Y-%m-%d') = `date`) AS `votes_count`
FROM `points`
WHERE `points`.`timestamp` > UNIX_TIMESTAMP(NOW() - INTERVAL 30 DAY) AND
      `server_id` = 24
GROUP BY `date`
ORDER BY `date`";

太慢,大约需要30秒。我的桌子是 enter image description here

我能做些什么让它快于2秒

1 个答案:

答案 0 :(得分:1)

尝试以下查询:

SELECT
    FROM_UNIXTIME(`timestamp`, '%Y-%m-%d') AS `date`,
    SUM (CASE WHEN type = 1 THEN votes ELSE 0 END) AS votes_count
FROM points
WHERE `timestamp` > UNIX_TIMESTAMP(NOW() - INTERVAL 30 DAY) AND
      server_id = 24
GROUP BY FROM_UNIXTIME(`timestamp`, '%Y-%m-%d')
ORDER BY `date`

这里我删除了SELECT语句中不必要的相关子查询。您似乎只想在type1时有条件地对投票进行总结。如果是,则以CASE语句的形式使用条件聚合。

如果此更改无法让您足够快,请考虑在timestampserver_id列上添加索引。添加这样的索引应该允许WHERE子句更有效地执行。

最后请注意,请避免使用关键字来命名列,例如: datetimestamp。虽然它们不是保留关键字,但它们在创建新表格的上下文中仍具有特殊含义。