我在我的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`";
我能做些什么让它快于2秒
答案 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
语句中不必要的相关子查询。您似乎只想在type
为1
时有条件地对投票进行总结。如果是,则以CASE
语句的形式使用条件聚合。
如果此更改无法让您足够快,请考虑在timestamp
和server_id
列上添加索引。添加这样的索引应该允许WHERE
子句更有效地执行。
最后请注意,请避免使用关键字来命名列,例如: date
和timestamp
。虽然它们不是保留关键字,但它们在创建新表格的上下文中仍具有特殊含义。