Администрирование пакета MySQL - Оптимизация запросов

ОГЛАВЛЕНИЕ

Оптимизация запросов

Какая оптимизация выполняется для условия 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 
  • Читаются все константы в таблице
    Постоянные таблицы:
    1. Таблица всего с одной записью.
    2. Таблица, которая использует только другие константы из таблиц и константы на полном уникальном ключе.

    const_table.key = constant

    const_table.key_part_1 = const_table2.field and
    const_table.key_part_2 = constant

  • Находится лучшая комбинация присоединений для соединения таблиц (увы, методом перебора :-( )
  • Для каждой таблицы используется, если возможно, линейный ключ для чтения записей. Каждый индекс таблицы опрашивается на предмет существования там ключа, который охватывает < 30% записей. Если такой ключ там найдется, то он используется, иначе используется быстрое сканирование таблицы.
  • Перед выводом каждой записи, пропускаются те, которые соответствуют предложению HAVING.