Администрирование пакета MySQL - Оптимизация запросов
ОГЛАВЛЕНИЕ
Страница 9 из 16
Оптимизация запросов
Какая оптимизация выполняется для условия WHERE?
- Удаление скобок (все ненужные скобки удаляются)
((a AND b) AND c OR (((a AND b) AND (c AND d)) -> (a AND b) OR (a AND b AND c AND d) - Выполняется свертывание констант
(a < b AND b=c) AND a=5 -> b > 5 AND b=5 - Удаление проверки условий в выражении с константами (необходимо из-за свертывания констант).
(b>=5 AND b=5) OR (b = 6 and 5 = 5) or (B=7 and 5 = 6) -> = B=5 or B=6 - Если выбор невозможен, возвращаются пустые строки.
- Поиск всех ключей, которые могут использоваться. Используется тот ключ, который находит меньше записей. Этот ключ используется в следующих выражениях:
=, >, >= <, <=, BETWEEN и LIKE с префиксом символа 'something%' - Удаляются ключи, которые не охватывают все уровни 'AND' и key_parts для которых не полностью определены требования key_parts.
key = 1 or A = 10 -> NULL (Нельзя использовать ключ) key = 1 or A = 10 and key=2 -> key = 1 OR key = 2 key_part_1 = const and key_part_3 = const -> key_part_1 = const
- Читаются все константы в таблице
Постоянные таблицы:- Таблица всего с одной записью.
- Таблица, которая использует только другие константы из таблиц и константы на полном уникальном ключе.
const_table.key = constant
const_table.key_part_1 = const_table2.field and
const_table.key_part_2 = constant - Находится лучшая комбинация присоединений для соединения таблиц (увы, методом перебора :-( )
- Для каждой таблицы используется, если возможно, линейный ключ для чтения записей. Каждый индекс таблицы опрашивается на предмет существования там ключа, который охватывает < 30% записей. Если такой ключ там найдется, то он используется, иначе используется быстрое сканирование таблицы.
- Перед выводом каждой записи, пропускаются те, которые соответствуют предложению HAVING.