Я знаю, что есть аналогичные вопросы о StackOverflow, но после тестирования разных индексов в моих таблицах, я думаю, что я не совсем понимаю, как работают индексы, и мне бы хотелось, чтобы кто-то мог объяснить поведение, которое я испытываю на своем производительность запросов.
Я использую этот запрос в качестве примера, я попытаюсь объяснить его подробно:
SELECT ss1.PlayerID, ss1.Name, ss1.Series, ss1.LanesNum, ss1.Date, ss1.LeagueName, ss1.Season FROM SeriesScores ss1
JOIN (SELECT Series, Gender, LanesNum, Bowlout, Season FROM SeriesScores
WHERE Gender = ? AND LanesNum = ? AND Series > -1 AND Bowlout = 'No' AND Season = '2011-2012'
ORDER BY Series DESC LIMIT 0,?) as ss2
USING(series, gender, lanesNum, bowlout, season)
ORDER BY ss1.Series DESC
Этот запрос используется для получения наибольшей серии боулинга в данный сезон для каждой пары дорожек в боулинг-центре для игроков мужского и женского пола.
Я присоединяюсь к таблице сам по себе, а не использую агрегатную функцию MAX, потому что если есть связь на данной паре дорожек, я хочу, чтобы все имена появлялись.
По сути, я соединяю все поля, которые соответствуют тому, что возвращает внутренний SELECT. Этот внутренний SELECT возвращает лучших игроков X для данного пола и данной пары дорожек.
ИСПОЛЬЗОВАНИЕ гарантирует, что будут выбраны только те игроки, которые не участвовали в турнирах, с тем же полом, серией, номерами и сезонами, которые я ищу. Затем я упорядочиваю их по старшим и младшим сериям.
Этот запрос находится в цикле for, который запускается 12 раз для мужчин и 12 раз для женщин (12 пар дорожек в боулинг-центре) с изменением только параметров lanesNum и пола.
Затем я поместил все результаты в два разных вектора в Java, чтобы отобразить результаты в приложении (один вектор для мужчин, один для женщин).
Без каких-либо индексов для запуска всего требуется около 11 секунд, включая помещение результатов в вектор и все такое. (5,5 секунд для 12 запросов для мужчин, то же самое для женщин).
С индексом (пол, номер линии, серия) на все это уходит 0,04 секунды, что удивительно, поскольку это более чем приемлемая скорость для моих нужд.
Я использовал этот индекс, потому что это все самые важные поля, которые я использую в своем предложении WHERE, но я не понимаю, почему он так сильно ускоряет, потому что я пробовал другие вещи и использовал некоторые другие индексы, которые на самом деле сделали мои запросы МЕНЬШЕ более чем на 100%. Кроме того, мне интересно, получу ли я еще более быстрый запрос, если добавлю к этому индексу «улавливание» и «сезон».
Я хотел сначала попробовать индекс по одному столбцу для серии и проверить производительность. Это индекс, который заставил все эти запросы занимать в общей сложности 22 секунды.
Я пришел к выводу, что я не понимаю, где я должен использовать свои индексы и когда я должен использовать их в нескольких полях, или использовать несколько индексов в отдельных полях и т. Д. Кроме того, я не понимаю, как использование (неправильных) индексов может фактически ухудшить производительность.