B.4.5 与优化器有关的问题
MySQL 使用基于成本的优化器来确定解决查询的最佳方法。在许多情况下,MySQL 可以计算出最佳的查询计划,但是有时 MySQL 手中没有足够的信息,因此必须对数据进行“有根据的”猜测。
对于 MySQL 没有做“正确”事情的情况,可以用来帮助 MySQL 的工具是:
mysql> EXPLAIN SELECT * FROM t1, t2 WHERE t1.i = t2.i;
EXPLAIN在第 13.8.2 节“ EXPLAIN 语句”中进行了更详细的讨论。
-
使用
ANALYZE TABLE tbl_name
更新扫描 table 的密钥分布。参见第 13.7.2.1 节“ ANALYZE TABLE 语句”。
SELECT * FROM t1, t2 FORCE INDEX (index_for_column)
WHERE t1.col_name=t2.col_name;
USE INDEX
和IGNORE INDEX
也可能有用。参见第 8.9.4 节“索引提示”。
-
全局和 table 级
STRAIGHT_JOIN
。参见第 13.2.9 节“ SELECT 语句”。 -
您可以调整全局或特定于线程的系统变量。例如,使用--max-seeks-for-key=1000选项开始mysqld或使用
SET max_seeks_for_key=1000
告诉优化器假定没有键扫描会导致超过 1000 个键查找。参见第 5.1.7 节“服务器系统变量”。