MySQL 8.4 Release Notes
B.3.5 与优化器相关的问题
MySQL 使用基于成本的优化器来确定如何最好地解决一个查询。在许多情况下,MySQL 可以计算出最佳可能的查询计划,但有时 MySQL 没有足够的信息来了解数据,并不得不对数据做出“educated”的猜测。
当 MySQL 做不到“正确”的事情时,你可以使用以下工具帮助 MySQL:
-
使用
EXPLAIN
语句来获取关于 MySQL 如何处理查询的信息。要使用它,只需在你的SELECT
语句前面加上关键字EXPLAIN
:mysql> EXPLAIN SELECT * FROM t1, t2 WHERE t1.i = t2.i;
EXPLAIN
在 第 15.8.2 节,“EXPLAIN 语句” 中有更详细的讨论。 -
使用
ANALYZE TABLE
更新扫描表的键分布。见 第 15.7.3.1 节,“ANALYZE TABLE 语句”。tbl_名称
-
使用
FORCE INDEX
对扫描表进行提示,告诉 MySQL 表扫描比使用给定索引的代价要高得多:SELECT * FROM t1, t2 FORCE INDEX (index_for_column) WHERE t1.col_name=t2.col_name;
USE INDEX
和IGNORE INDEX
也许会很有用。见 第 10.9.4 节,“索引提示”。 -
全局和表级别的
STRAIGHT_JOIN
。见 第 15.2.13 节,“SELECT 语句”。 -
你可以调整全局或线程特定的系统变量。例如,用 mysqld 启动时使用
--max-seeks-for-key=1000
选项,或者使用SET max_seeks_for_key=1000
告诉优化器假设任何键扫描的代价不会超过 1,000 次关键字搜索。见 第 7.1.8 节,“服务器系统变量”。