проблема со скорость выборки. (MySQL)Есть такой запрос -
SELECT COUNT(DISTINCT pitchID) AS counter FROM LiveDeck WHERE lockID=?
На таблице есть индекс lockiD.
Вопрос:
-Можно ли ускорить выборку добавив индекс (LockID, pitchID) или (pitchID, lockID)?
-Влияет ли индекс на поле которое находится в SELECT ?
-Влияет ли индекс на поле в DISTINCT ?
>Можно ли ускорить выборку добавив индекс Вполне вероятно, что да. Но на самом деле -- проверять надо, это зависит от данных. Да, индэкс, конечно, (lockID, pitchID). Вероятность, что поможэт обратный порядок -- невелика, и в любом случае первый лучшэ. >лияет ли индекс на поле которое находится в В смысле значения этого поля -- нет, не должэн. Можэт поменяться порядок строк. Тожэ самое и по третьему вопросу.
И да, если "влияет ли" в смысле влияет ли на скорость выборки и план запроса -- посмотрите планы, померьте запросы и проверьте. Не всегда влияет.
Больше спасибо . Да , спрашивал за скорость запроса
1) можно 2) нет 3) нет
Сколько записей в таблице по этому условию и сколько всего?
25 миллионов всего
По этому условию должно вернуть 5500 записей
Селективность хорошая, и так все должно хорошо работать
Да , но в последнее время начали появляться запросы с 12 сек откликом +, становится все чаще
5500 key look up в его случае, не хорошая селективность для его случая, что изначально по некластерному бежит
А ты посчитай...
Перепроверь, что это точно ЭТОТ запрос, а не другой
Перепроверь, что для именно того WHERE lockID=? где 12 секунд, ТОЖЕ 5.5 к записей. А не скажем миллион.
Да , запрос тот . Вообще сейчас стоит запрос - SELECT COUNT(*) FROM (SELECT pitchID FROM LiveDeck WHERE lockID =? GROUP BY pitchID) AS counter И это он отдаёт 12+ сек. Сейчас я его сократил на SELECT COUNT(DISTINCT pitchID) AS counter FROM LiveDeck WHERE lockID=? При тесте скорость осталась таже. Сейчас создал тестовый инстанс и накатил туда фэйковые данные. Посмотрел через Explaine SELECT … и увидел что индекс lockID и индекс (lockID, pitchID) регистрируют одинаковое количество строк. Вообщем утром залью на stage - посмотрю как оно будет
Так это вообще другой запрос.
Почему ? Он возвращает тоже значение
Так пишите запрос типа SELECT 42; — он же то же значение возвращает.,, :)
По идеи group by неявно создаёт таблицу копий и сортирует ее, а дистинкт просто создаёт таблицу копий, разве нет ? Если не прав - поправьте меня. Просто на данный момент стоит задача оптимизировать запрос
Нет, ваши "по идее" не работают
там немного не так. он таблицы не создает. можете использовать аналогую итератора из языков программирования. базы обычно используют модель вулкано - это такая композиция итераторов. т.е ваш запрос га групбай- это композиция итераторов
Теперь понятно , спасибо
В принцыпе, с HDD на холодную -- нормально. С SSD -- это что-то не то.
Обсуждают сегодня