MySQL 使用基于成本的优化器来确定解决查询的最佳方法。在许多情况下,MySQL 可以计算出可能的最佳查询计划,但有时 MySQL 手头没有足够的数据信息,不得不对数据进行“有 根据的”猜测。
对于 MySQL 没有做“正确”事情的情况,可用于帮助 MySQL 的工具有:
使用该
EXPLAIN
语句获取有关 MySQL 如何处理查询的信息。要使用它,只需将关键字添加 到语句EXPLAIN
的前面 :SELECT
mysql> EXPLAIN SELECT * FROM t1, t2 WHERE t1.i = t2.i;
EXPLAIN
在第 13.8.2 节“EXPLAIN 语句”中有更详细的讨论。用于更新扫描表的键分布。请参阅 第 13.7.3.1 节,“ANALYZE TABLE 语句”。
ANALYZE TABLE
tbl_name
用于
FORCE INDEX
扫描表告诉 MySQL 与使用给定索引相比,表扫描非常昂贵:SELECT * FROM t1, t2 FORCE INDEX (index_for_column) WHERE t1.col_name=t2.col_name;
USE INDEX
也IGNORE INDEX
可能有用。请参阅 第 8.9.4 节,“索引提示”。全局和表级
STRAIGHT_JOIN
。请参阅 第 13.2.10 节,“SELECT 语句”。您可以调整全局或线程特定的系统变量。例如,使用选项或使用启动mysqld 来告诉 优化器假定没有键扫描会导致超过 1,000 次键查找。请参阅 第 5.1.8 节,“服务器系统变量”。
--max-seeks-for-key=1000
SET max_seeks_for_key=1000