Какая оптимизация выполняется для условия WHERE?


serge - Posted on 20 Октябрь 2009

  • Удаление скобок (все ненужные скобки удаляются)
    ((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.

Поиск

Добавить сайт в Закладки

ОднаКнопка