我正在尝试优化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用作限制不会在查询中返回任何记录。将数字设为5将返回五条记录。如果指定表中的记录少于N,则将查询表中的所有记录返回到结果集中。 [来源:guru99.com]
要解决此问题,我正在使用一种启发式方法来猜测用户的条目数是否很小-如果是这样,我将使用大约1500毫秒的其他查询。
这里有什么我想念的吗?由于数据已加密,因此无法使用索引。
非常感谢
答案 0 :(得分:0)
我认为ActivityX(user, ActivityNum)
上的索引可以解决您的问题。
我猜测您在(ActivityNum)
上有一个索引,优化器正在尝试确定是否应使用该索引。这导致阈值化。复合索引应该更好地匹配查询。