Предотвращение сортировки файлов MySQL - PullRequest
0 голосов
/ 10 июля 2019

У меня есть клиент, работающий с фотогалереей php (на php 5.5, mysql 5.5, с использованием таблиц myisam), который использует метод дерева каталогов.К сожалению, некоторые запросы в их приложении галереи требуют ужасно длинных файловых сортировок.Запрос нарушен:

SELECT `name`, `slug` 
FROM `db_table` 
WHERE `left_ptr` <= '914731' 
  AND `right_ptr` >= '914734' 
  AND `id` <> 1 
ORDER BY `left_ptr` ASC

Есть индексы id, left_ptr и right_ptr, но согласно EXPLAIN ни один из них не используется в запросе.

Я слышал, что при созданиисоставной индекс (в столбцах «условие») сделает вещи быстрее, но относится ли это к этому случаю?Последнее условие на самом деле является предложением «что угодно, кроме 1», так будет ли к этому также применяться составной индекс?Спасибо за понимание этого.

1 Ответ

2 голосов
/ 10 июля 2019

Да, составной индекс на (left_ptr, right_ptr) должен улучшить выполнение этого запроса.

MySQL будет использовать только один индекс на запрос .Скорее всего, он не использует какой-либо один индекс, поскольку определено, что ни один индекс не будет намного быстрее, чем полное сканирование таблицы.Например, id <> 1 - это каждая строка, кроме первой, поэтому просто выполните полное сканирование таблицы.Два других фильтра зависят от того, как распределены данные, но если он не фильтрует значительную часть таблицы, он не будет использовать индекс.

Составной индекс на (left_ptr, right_ptr) должен выполнить этот запросбеги лучше.Не беспокойтесь о id, так как выше id <> 1 фильтрует только одну строку.

MySQL может использовать только первый столбец составного индекса, поэтому этот составной индекс также заменяет один только для left_ptr

...