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 найденных ключей.