#### 15.8.10.2 配置非持久优化器统计参数

[](<>)[](<>)[](<>)

本节介绍如何配置非持久优化器统计信息。优化器统计信息不会持久保存到磁盘[`innodb_stats_persistent=OFF`](innodb-parameters.html#sysvar_innodb_stats_persistent)或者当创建或更改单个表时[`STATS_PERSISTENT=0`](create-table.html).相反，统计信息存储在内存中，并在服务器关闭时丢失。统计数据也会通过某些操作和在某些条件下定期更新。

优化器统计信息默认保存到磁盘，由[`innodb_stats_persistent`](innodb-parameters.html#sysvar_innodb_stats_persistent)配置选项。有关持久优化器统计信息的信息，请参阅[第 15.8.10.1 节，“配置持久优化器统计参数”](innodb-persistent-stats.html).

##### 优化器统计更新

非持久优化器统计信息在以下情况下更新：

-   跑步[`分析表`](analyze-table.html).

-   跑步[`显示表状态`](show-table-status.html),[`显示索引`](show-index.html)，或查询[`INFORMATION_SCHEMA.TABLES`](information-schema-tables-table.html)要么[`INFORMATION_SCHEMA.STATISTICS`](information-schema-statistics-table.html)表与[`innodb_stats_on_metadata`](innodb-parameters.html#sysvar_innodb_stats_on_metadata)选项启用。

    默认设置为[`innodb_stats_on_metadata`](innodb-parameters.html#sysvar_innodb_stats_on_metadata)是`离开`.启用[`innodb_stats_on_metadata`](innodb-parameters.html#sysvar_innodb_stats_on_metadata)可能会降低具有大量表或索引的模式的访问速度，并降低涉及查询的执行计划的稳定性`InnoDB`表。[`innodb_stats_on_metadata`](innodb-parameters.html#sysvar_innodb_stats_on_metadata)使用全局配置[`放`](set.html)陈述。

    ```
    SET GLOBAL innodb_stats_on_metadata=ON
    ```

    笔记

    [`innodb_stats_on_metadata`](innodb-parameters.html#sysvar_innodb_stats_on_metadata)仅适用于优化器[统计数据](glossary.html#glos_statistics)配置为非持久（当[`innodb_stats_persistent`](innodb-parameters.html#sysvar_innodb_stats_persistent)被禁用）。

-   开始一个[**mysql**](mysql.html)客户与[`--auto-rehash`](mysql-command-options.html#option_mysql_auto-rehash)选项已启用，这是默认设置。这[`自动重新散列`](mysql-command-options.html#option_mysql_auto-rehash)选项导致所有`InnoDB`要打开的表，并且打开表操作会导致重新计算统计信息。

    为了提高启动时间[**mysql**](mysql.html)客户端和更新统计信息，您可以关闭[`自动重新散列`](mysql-command-options.html#option_mysql_auto-rehash)使用[`--disable-auto-rehash`](mysql-command-options.html#option_mysql_auto-rehash)选项。这[`自动重新散列`](mysql-command-options.html#option_mysql_auto-rehash)功能为交互式用户启用数据库、表和列名的自动名称完成。

-   首先打开一个表。

-   `InnoDB`检测到自上次更新统计信息以来已修改了 1 / 16 的表。

##### 配置采样页数

MySQL 查询优化器使用估计的[统计数据](glossary.html#glos_statistics)关于键分布来选择执行计划的索引，基于相对[选择性](glossary.html#glos_selectivity)的指数。什么时候`InnoDB`更新优化器统计信息，它从表上的每个索引中随机抽取页面以估计[基数](glossary.html#glos_cardinality)的指数。（这种技术被称为[随机潜水](glossary.html#glos_random_dive).)

为了让您控制统计估计的质量（从而为查询优化器提供更好的信息），您可以使用参数更改采样页面的数量[`innodb_stats_transient_sample_pages`](innodb-parameters.html#sysvar_innodb_stats_transient_sample_pages).默认的采样页数为 8，这可能不足以产生准确的估计，从而导致查询优化器的索引选择不佳。这种技术对于大型表和用于[加入](glossary.html#glos_join).不必要[全表扫描](glossary.html#glos_full_table_scan)对于这样的表可能是一个重大的性能问题。看[第 8.2.1.23 节，“避免全表扫描”](table-scan-avoidance.html)有关调整此类查询的提示。[`innodb_stats_transient_sample_pages`](innodb-parameters.html#sysvar_innodb_stats_transient_sample_pages)是一个可以在运行时设置的全局参数。

的价值[`innodb_stats_transient_sample_pages`](innodb-parameters.html#sysvar_innodb_stats_transient_sample_pages)影响所有的索引抽样`InnoDB`表和索引何时[`innodb_stats_persistent=0`](innodb-parameters.html#sysvar_innodb_stats_persistent).当您更改索引样本大小时，请注意以下潜在的重大影响：

-   像 1 或 2 这样的小值可能会导致对基数的估计不准确。

-   增加[`innodb_stats_transient_sample_pages`](innodb-parameters.html#sysvar_innodb_stats_transient_sample_pages)value 可能需要更多的磁盘读取。远大于 8 的值（例如 100）可能会导致打开表或执行所需的时间显着减慢`显示表状态`.

-   优化器可能会根据对索引选择性的不同估计选择非常不同的查询计划。

    无论价值[`innodb_stats_transient_sample_pages`](innodb-parameters.html#sysvar_innodb_stats_transient_sample_pages)最适合系统，设置选项并将其保留为该值。选择一个值，该值可以对数据库中的所有表进行合理准确的估计，而不需要过多的 I/O。因为统计数据会在不同时间自动重新计算，而不是在执行[`分析表`](analyze-table.html)，增加索引样本量没有意义，运行[`分析表`](analyze-table.html)，然后再次减小样本量。

    较小的表通常比较大的表需要更少的索引样本。如果您的数据库有许多大表，请考虑为[`innodb_stats_transient_sample_pages`](innodb-parameters.html#sysvar_innodb_stats_transient_sample_pages)比您的桌子大多较小。
