Профиль MySQL по запросу «Создание индекса сортировки», использующий 75% общего времени

11

Мы пытаемся выяснить, как оптимизировать запрос (занимает около 100 мс) , и работает ли профиль, который мы видим, Creating Sort Indexиспользуя 75%общее время. Во-первых, что именно влияет на создание индекса сортировки? Это диск / IO?

Во-вторых, можем ли мы оптимизировать сам запрос?

SELECT r.`id`, 
       r.name, 
       r.public_uri, 
       rv.version, 
       rv.interpreter, 
       rv.notes, 
       rv.content, 
       r.added, 
       r.added_by, 
       r.modified, 
       r.modified_by, 
       r.public, 
       r.public_by
  FROM recipe_heads rh, 
       recipes r, 
       recipe_versions rv
 WHERE rh.recipe = r.`id` 
   AND rh.recipe_version = rv.`id` 
   AND r.`id` = rv.recipe
ORDER BY r.added DESC

Объясните: Скриншот

Джастин
источник

Ответы:

6

У нас была похожая проблема для огромных запросов. Часто запросы выполнялись в течение нескольких часов (до 7-8) в зависимости от нагрузки на БД для 400M строк. Однако наша цель состояла в том, чтобы достичь результатов группы, таких как выбор col1, col2, col3, count (1), count (отличный col4) из группы таблиц на 1,2,3.

Основная проблема та же, что и у вас, поскольку в обоих случаях БД сортирует (упорядочивает) результаты внутренне.

  • Как работает создание индекса сортировки. На веб-сайте mysql говорится: «Поток обрабатывает SELECT, который разрешается с использованием внутренней временной таблицы». В соответствии с моим пониманием алгоритма, система, скорее всего, разбивает данные на порции, читает с диска эти порции один за другим, сортирует отдельные порции, помещает их обратно во временное дисковое пространство и так далее. Система делает это для всех блоков и в конечном итоге выполняет сортировку слиянием. Это включает в себя обширное чтение / запись.

Возможное решение может состоять в том, чтобы увеличить вашу память для БД (чтобы она могла создавать большие фрагменты, которые могут оставаться в памяти), или, если у вас больше памяти, где-то еще, вы можете запрограммировать решение путем потоковой передачи из БД. Это может быть достигнуто во время nlogn.

Программно, я мог бы сократить время в среднем от 2 часов до 7,5 минут.

Чандни
источник
4

«Создание индекса сортировки» - это база данных, определяющая порядок возвращаемых значений на основе вашего предложения «упорядочить по». Основными ограничителями здесь будут доступная скорость CPU / CPU и пропускная способность памяти. Сортировка не будет выполнена до тех пор, пока данные уже не будут все в памяти, по крайней мере, для такого маленького запроса. Если вы профилируете запрос, вы видите какие-либо ожидания каких-либо ресурсов?

Что касается ускорения этого запроса, вы можете рассмотреть возможность добавления индекса в r.added, так как он не выглядит таковым, как вы объясняете.

Единорог Марли
источник
Рецепты addedдействительно имеют стандартный индекс.
Джастин