我正在使用下面的查询来创建本周排名前十的人的领导板。
SELECT
users.id,
concat(users.first_name, ' ', users.last_name) as name,
users.picture_url,
MAX(rounds.speed) as speed,
AVG(rounds.accuracy) as accuracy,
SUM(rounds.score) as score,
users.level
FROM users INNER JOIN rounds ON users.email=rounds.email
WHERE DATE(rounds.dateTime) BETWEEN CURDATE()-INTERVAL 1 WEEK AND CURDATE()
GROUP BY users.id
ORDER BY score DESC, speed DESC
LIMIT 10目前,运行此查询需要大约6秒时间。这张桌子的“圆圈”大约有3000行。很快它就会大得多。因此,一旦用户打开领导板,它需要超过6秒的加载!
是否有任何方法来缓存或改进查询,使其加载得更快?
数据库: MySQL后端: PHP5框架:代码点火器
发布于 2016-12-26 17:55:11
(1)考虑设计模式,以便加入users.id,而不是users.email。这将导致一种更好的方法来制定查询--通过在加入users之前计算聚合。
(2)不要在函数中隐藏索引列;不能使用索引。而不是
WHERE DATE(rounds.dateTime) BETWEEN CURDATE()-INTERVAL 1 WEEK
AND CURDATE() 使用
WHERE dateTime >= CURDATE() - INTERVAL 1 WEEK
AND dateTime < CURDATE()(3)综合指数:
INDEX(email, dateTime) -- after doing (2)
INDEX(dateTime) -- after doing both (1) and (2)https://dba.stackexchange.com/questions/159162
复制相似问题