我正在我的 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 秒
最佳答案
尝试以下查询:
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
子句更有效地执行。
最后一点,请避免使用关键字来命名您的列,例如日期
和时间戳
。虽然它们不是保留关键字,但它们在上下文中仍然具有特殊含义,例如,创建新表。
关于php - Mysql 查询花费太多时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43730296/