### B.3.5 优化器相关问题

MySQL 使用基于成本的优化器来确定解决查询的最佳方法。在许多情况下，MySQL 可以计算出可能的最佳查询计划，但有时 MySQL 没有足够的关于手头数据的信息，不得不对数据进行“有根据的”猜测。

对于 MySQL 没有做“正确”事情的情况，您可以帮助 MySQL 的工具是：

-   使用[`解释`](explain.html)语句以获取有关 MySQL 如何处理查询的信息。要使用它，只需添加关键字[`解释`](explain.html)到你的面前[`选择`](select.html)陈述：

    ```
    mysql> EXPLAIN SELECT * FROM t1, t2 WHERE t1.i = t2.i;
    ```

    [`解释`](explain.html)在中更详细地讨论[第 13.8.2 节，“解释声明”](explain.html).

-   采用`分析表 *`tbl_name`*`更新扫描表的键分布。看[第 13.7.3.1 节，“ANALYZE TABLE 语句”](analyze-table.html).

-   [](<>)采用`力指数`让扫描的表告诉 MySQL 与使用给定索引相比，表扫描非常昂贵：

    ```
    SELECT * FROM t1, t2 FORCE INDEX (index_for_column)
    WHERE t1.col_name=t2.col_name;
    ```

    `使用索引`和`忽略索引`也可能有用。看[第 8.9.4 节，“索引提示”](index-hints.html).

-   全局和表级`STRAIGHT_JOIN`.看[第 13.2.10 节，“SELECT 语句”](select.html).

-   您可以调整全局或线程特定的系统变量。例如，开始[**mysqld**](mysqld.html)与[`--max-seeks-for-key=1000`](server-system-variables.html#sysvar_max_seeks_for_key)选项或使用`设置 max_seeks_for_key=1000`告诉优化器假设没有键扫描会导致超过 1,000 次键搜索。看[第 5.1.8 节，“服务器系统变量”](server-system-variables.html).
