MySQL 8.3 Release Notes
MySQL 使用基于成本的优化器来确定查询的最佳方式。在许多情况下,MySQL 可以计算出最佳的查询计划,但有时 MySQL 无法获取足够的数据信息,并且需要对数据做出“有根据的”猜测。
对于 MySQL 无法做出“正确”的事情,以下工具可以帮助 MySQL:
-
使用
EXPLAIN
语句来获取查询处理信息。要使用它,只需在 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_name
-
使用
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 节,“服务器系统变量”。