zoukankan      html  css  js  c++  java
  • 【MySQL】MySQL 5.7持久化统计信息详解

    一、持久化统计信息的意义:
      统计信息用于指导MySQL生成执行计划,执行计划的准确与否直接影响到SQL的执行效率;如果MySQL一重启之前的统计信息就没有了,那么当SQL语句来临时,那么MySQL就要收集统计信息然后再生成SQL语句的执行计划。如果能在关闭MySQL时就把统计信息保存起来,那么在启动时就不要再收集一次了,这种处理方式有助于效率的提升。


    二、统计信息准确与否也同样重要:

      第一目中我们说明了“持久化统计信息的意义”,我们的假设统计信息是有用的,是准确的;如果统计信息本身已经过时了,比如说统计信息是在表中只有100行时统计出来的,这种情况下往往走全表扫描开销会更小。但是,现在表中的行数已经达到了100万行,明显这种过时的统计信息会引发性能灾难,所以统计信息的时效性也是同样重要的。那MySQL它什么时候自动更新统计信息呢?默认情况下当表中的数据有10%被修改过的就会更新。


    三、MySQL对统计信息的处理:
    针对上面的两个问题MySQL都有给出解决方案,并且都可能通过简单的配置来解决
    1、针对是否持久化统计信息MySQL可以通过innodb_stats_persistent参数来控制
    2、针对统计信息的时效性,MySQL通过innodb_stats_auto_recalc参数来控制是否自动更新
    3、针对统计信息的准确性,MySQL通过innodb_stats_persistent_sample_pages参数来控制更新统计信息时的采样,样本页面的数量。
    [root@localhost ~]# vim /etc/my.cnf
    [mysqld]
    innodb_stats_persistent=1
    innodb_stats_auto_recalc=1
    innodb_stats_persistent_sample_pages=20


    四、手动更新统计信息的方式:
    MySQL通过analyze table语句来手动的更新统计信息


    五、查看表的统计信息是什么时候更新的:
      MySQL把统计信息相关的内容记录在mysql.innodb_table_stats,mysql.innodb_index_stats这两张表里面。
    mysql.innodb_table_stats以表为单位记录着统计信息
    mysql> select * from innodb_table_stats;

    各个列所代表的意义:
    database_name        表所在的库名
    table_name          表名
    last_update          最近一次的更新时间
    n_rows            表中的行数
    clustered_index_size      主键的大小
    sum_of_other_index_sizes   所有二级索引的大小


    六、analyze table过程中的经验:
      如果用explain语句查看SQL的执行计划的时候发现,计划走的不准,多半是由于统计信息过时引起的,这时就要执行一下analyze table来重新生成一下执行计划;有时可能发现重新生成执行计划后并没有什么用SQL还是走的不准,这时最可能的原因就是生成执行计划时的采样页的数量太低,innodb_stats_persistent_sample_pages这个参数的值,注意这个值也不要加的太大,要不然会老半天都执行不完analyze table语句。

  • 相关阅读:
    优化SQL Server数据库的经验总结
    #main和.main区别
    通过SQL把n条记录插入表中
    11月6日到8日参加微软Tech.ED2008大会
    NOIP2017 D2T1奶酪
    NOIP2017 D1T2时间复杂度
    NOIP2017 D2T2宝藏
    NOIP2017 D1T1小凯的疑惑
    NOIP2017 D1T3逛公园
    NOIP2017 D2T3列队
  • 原文地址:https://www.cnblogs.com/OrcinusOrca/p/14817285.html
Copyright © 2011-2022 走看看