我正在尝试优化mysql查询。只要特定用户的数据库中有超过15个条目,下面的查询就可以正常运行。
SELECT activityType, activityClass, startDate, endDate, activityNum, count(*) AS activityType
FROM (
SELECT activityType, activityClass, startDate, endDate, activityNum
FROM ActivityX
WHERE user=?
ORDER BY activityNum DESC
LIMIT 15) temp
WHERE startDate=? OR endDate=?
GROUP BY activityType
当参赛作品不足15个时,表现就很糟糕。我的计时大约是25毫秒,而不是4000毫秒(我需要“15”来确保我得到所有相关的数据)
我发现了这些有趣的句子:“limit n”是关键字,n是从0开始的任何数字,把0作为limit不会在查询中返回任何记录。输入一个数字5将返回5条记录。如果指定表中的记录小于n,则查询表中的所有记录都将返回到结果集中[图片来源:guru99.com]
为了解决这个问题,我使用了一种启发式方法来猜测用户的条目数是否很小——如果是这样,我使用了一个需要1500毫秒的不同查询。
我有什么遗漏吗?我不能使用索引,因为数据是加密的。
非常感谢,
乔恩
1条答案
按热度按时间a0x5cqrl1#
我认为一个索引
ActivityX(user, ActivityNum)
会解决你的问题。我猜你有一个索引
(ActivityNum)
优化器正在尝试找出是否应该使用索引。这会导致阈值。复合索引应该更好地匹配查询。