Поиск

Проблемы, связанные с оптимизатором

MySQL использует оптимизатор затрат для определения лучшего способа разрешения запроса. В большинстве случаев MySQL способен вычислить наиболее эффектив­ ный из возможных план, но иногда у него в наличии нет достаточного количества ин­ формации по данным, и ему приходится строить о них логические предположения.

В ситуациях, когда MySQL делает не то, что нужно, помочь ему можно следующим образом:

■ Воспользуйтесь оператором EXPLAIN , чтобы получить информацию о том, каким
образом MySQL будет обрабатывать запрос. Для этого необходимо просто доба­
вить ключевое слово EXPLAIN в начале оператора SELECT .

mysql> EXPLAIN SELECT * FROM tl, t2 WHERE tl.i = t2.i;

Оператор EXPLAIN более подробно рассматривается в книге MySQL . Руководство администратора.

  • Используйте ANALYZE TABLE имя_таблицы для обновления распределений ключей сканируемой таблицы.
  • Используйте FORCE INDEX для сканируемой таблицы, чтобы сообщить MySQL о том, что сканирование таблиц обходится дороже по сравнению с применением данного индекса.

SELECT * FROM tl , t 2 FORCE INDEX (индекс_по_столбцу) WHERE tl .имя_столбца=12.имя_столбца;

Также могут пригодиться USE INDEX и IGNORE INDEX .

  • Используйте STRAIGHT _ JOIN как глобально, так и на уровне таблиц.
  • Можно настроить глобальные и сеансовые системные переменные. Например, запустите mysqld с опцией —- max - seeks - for - key =1000 или используйте SET max _ seeks _ for _ key =1000, чтобы оптимизатор при сканировании ключей разрешал не более 1000 найденных ключей.