Документация на 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.
  • Оптимизация памяти, используемой таблицами

    Есть несколько вещей, которые Вы можете сделать, чтобы минимизировать количество места, которое используют ваши таблицы. Прежде всего используйте НЕ ПУСТОЙ указатель всякий раз, когда возможно. Это ускорит запросы, и сохранит 1 бит на поле.

    Вы можете сохранить много места, используя меньшие целочисленные переменные. Например, MEDIUMINT часто вполне достаточен.

    Вообще Вы должны выбрать самый маленький тип данных, в котором Вы будете нуждаться, если есть проблемы с памятью.

    Имейте в виду, что поля фиксированной длины в mysql обрабатываются значительно быстрее. Избегая полей переменной длины (VARCHAR, BLOBs), можно повысить эффективность на 10-200%.



    Содержание раздела