• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 配置非持久性优化器统计参数

    本节介绍如何配置非持久性优化器统计信息。当innodb_stats_persistent=OFF或使用创建或更改单个表时,Optimizer统计信息不会保留在磁盘上STATS_PERSISTENT=0。相反,统计信息存储在内存中,并且在服务器关闭时会丢失。统计信息还可以通过某些操作在特定条件下定期更新。

    默认情况下,优化器统计信息会保留在磁盘上,并由innodb_stats_persistent配置选项启用。有关持久性优化器统计信息,请参见“配置持久性优化器统计参数”。

    优化器统计信息更新

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

    • 运行中ANALYZE TABLE
    • 运行SHOW TABLE STATUSSHOW INDEX或在启用了该选项的情况下查询INFORMATION_SCHEMA.TABLESINFORMATION_SCHEMA.STATISTICSinnodb_stats_on_metadata

      的默认设置innodb_stats_on_metadataOFF。启用innodb_stats_on_metadata可能会降低具有大量表或索引的架构的访问速度,并降低涉及InnoDB表的查询的执行计划的稳定性。innodb_stats_on_metadata使用一条SET语句全局配置。

      SET GLOBAL innodb_stats_on_metadata=ON
      
      注意

      innodb_stats_on_metadata仅当优化器统计信息配置为非持久性(innodb_stats_persistent禁用时)时才适用。

    • 使用启用的选项启动mysql客户端--auto-rehash,这是默认设置。该auto-rehash选项将导致所有InnoDB表被打开,并且打开表操作将导致统计信息被重新计算。

      为了提高mysql客户端的启动时间并更新统计信息,可以auto-rehash使用该--disable-auto-rehash选项将其关闭。该auto-rehash功能可为交互式用户自动完成数据库,表和列名称的名称命名。

    • 首先打开一个表。
    • InnoDB检测到自上次更新统计信息以来,表的1/16已被修改。

    配置采样页数

    MySQL查询优化器基于索引的相对选择性,使用有关键分布的估计统计信息来选择执行计划的索引。当更新优化器统计信息,从表中的每个索引它的样本的随机页面来估计基数的指数。(这种技术被称为随机潜水。)InnoDB

    为了控制统计信息估计的质量(从而为查询优化器提供更好的信息),您可以使用参数更改采样页数innodb_stats_transient_sample_pages。默认的采样页数是8,可能不足以产生准确的估计值,从而导致查询优化器的索引选择不正确。对于大型表和联接中使用的表,此技术尤其重要。此类表的不必要的全表扫描可能是一个严重的性能问题。有关调优此类查询的提示,请参见“避免全表扫描”。innodb_stats_transient_sample_pages是可以在运行时设置的全局参数。

    的值innodb_stats_transient_sample_pages影响InnoDB时所有表和索引的索引采样innodb_stats_persistent=0。更改索引样本大小时,请注意以下潜在的重大影响:

    • 较小的值(例如1或2)可能会导致基数估计不准确。
    • 增大该innodb_stats_transient_sample_pages值可能需要更多的磁盘读取。大于8的值(例如100)会导致打开表或执行时间大大减慢SHOW TABLE STATUS
    • 优化器可能基于对索引选择性的不同估计来选择非常不同的查询计划。

    无论哪种值对innodb_stats_transient_sample_pages系统最有效,请设置该选项并将其保留为该值。选择一个可以对数据库中的所有表进行合理准确估计的值,而无需过多的I / O。由于统计信息会在执行以外的其他时间自动重新计算ANALYZE TABLE,因此增加索引样本大小,运行ANALYZE TABLE并再次减小样本大小没有意义。

    较小的表通常比较大的表需要更少的索引样本。如果您的数据库有很多大表,则考虑使用innodb_stats_transient_sample_pages比大多数情况下较小的表更高的值。