带有LIMIT关键字的MySQL优化问题

时间:2018-11-01 20:17:35

标签: mysql sql sql-optimization

我正在尝试优化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毫秒的其他查询。

这里有什么我想念的吗?由于数据已加密,因此无法使用索引。

非常感谢

  • Jon

1 个答案:

答案 0 :(得分:0)

我认为ActivityX(user, ActivityNum)上的索引可以解决您的问题。

我猜测您在(ActivityNum)上有一个索引,优化器正在尝试确定是否应使用该索引。这导致阈值化。复合索引应该更好地匹配查询。