У меня есть довольно популярный сайт, который сейчас переполнен большим трафиком, и мой веб-хост мне сообщил, что выполнение следующего запроса занимает до 2 секунд. Мои навыки работы с MySQL не так велики, поэтому я уверен, что делаю что-то не так, но я не уверен, что можно сделать, чтобы улучшить это.
Для простоты предположим, что live_blueprints - это таблица с четырьмя полями:
- isSolved [tinyint (1)]
- levelSlug [varchar (128)]
- раствор [varchar (255)]
- trackCount [mediumint (7)]
Я понимаю, что использование строки (levelSlug) вместо int (id), вероятно, плохая идея, так что это одна из вещей, которую я хотел бы исправить. В основном, что я пытаюсь сделать с этим запросом, это взять 49 лучших чертежей с уникальными строками решения. Таблица live_blueprints имеет ~ 550 тыс. Строк, и я думаю, что это основная причина проблемы. Насколько я понимаю, это то, как написано это, он проверит все 550 тыс. Строк, а затем сгруппирует их, а затем отрежет 49 лучших, чтобы дать мне ... Мне просто интересно, есть ли способ Я мог бы сделать это без необходимости делать так много работы со строками ... Возможно, даже создав вторую таблицу просто «уникальных» решений.
В любом случае, вот запрос прямо сейчас:
SELECT *
FROM live_blueprints
WHERE levelSlug = 'someLevelSlug'
&& isSolved = 1
GROUP BY solution
ORDER BY trackCount ASC
LIMIT 49
Спасибо за любую помощь или понимание, которое вы можете предоставить!
Хорошо, ответим на несколько вопросов:
Единственные индексы в таблице - это id и levelSlug. Для начала я собираюсь добавить индекс для решения.
Я сделал объяснение, так что я думаю, что это то, что вы ищете, levelID - это индекс для levelSlug.
id > 1
select_type > SIMPLE
table > live_blueprints
type > ref
possible_keys > levelID
key > levelID
key_len > 386
ref > const
rows > 4407
Extra > Using where; Using temporary; Using filesort