Как я могу сделать этот запрос MySQL SELECT + GROUP BY более эффективным? - PullRequest
0 голосов
/ 24 октября 2010

У меня есть довольно популярный сайт, который сейчас переполнен большим трафиком, и мой веб-хост мне сообщил, что выполнение следующего запроса занимает до 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

Ответы [ 2 ]

0 голосов
/ 31 декабря 2010

Как насчет добавления еще одного столбца, давайте назовем его ранжированным, так как он будет только для вашего использования.При добавлении нового решения, если оно уже существует, обнулите этот столбец, иначе вставьте 1 или что-то еще, например, количество дорожекТаким образом, вы можете избавиться от группы с помощью трекконта, где рейтинг не равен 0.

0 голосов
/ 24 октября 2010

Какие у вас индексы на вашей таблице?

Потому что наличие индекса на solution, solutionCoolness (в таком порядке) должно немного помочь здесь.

С предложениями whereВы могли бы даже использовать индекс со столбцами levelSlug, isSolved, solution, solutionCoolness в этом порядке, чтобы сделать его немного быстрее.

В любом случае нам нужно знать, какие у вас есть индексы, и это поможет увидеть explainзапрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...