Проблемы оптимизации MySQL с ключевым словом LIMIT - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь оптимизировать запрос 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 голосов
/ 02 ноября 2018

Я думаю, что индекс на ActivityX(user, ActivityNum) решит вашу проблему.

Я предполагаю, что у вас есть индекс на (ActivityNum), и оптимизатор пытается выяснить, должен ли он использовать индекс. Это вызывает порог. Составной индекс должен лучше соответствовать запросу.

...