Я пытаюсь оптимизировать запрос 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 мс.
Есть что-нибудь, что я здесь скучаю? Я не могу использовать индекс, поскольку данные зашифрованы.
Большое спасибо,