详解mysql持久化统计信息

 更新时间:2020年12月01日 11:31:21   作者:蒋乐兴的技术随笔  
这篇文章主要介绍了mysql持久化统计信息的相关资料,帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下

一、持久化统计信息的意义:

  统计信息用于指导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 参数来控制更新

  统计信息时的采样,样本页面的数量。

四、手动更新统计信息的方式:

  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 |
+---------------+----------------------------+---------------------+--------+----------------------+--------------------------+
| fdb      | auth_group         | 2017-08-10 14:36:40 |   0 |          1 |            1 |
| fdb      | auth_group_permissions   | 2017-08-10 14:36:41 |   0 |          1 |            2 |
| fdb      | auth_permission      | 2017-08-10 14:36:41 |   30 |          1 |            1 |
| fdb      | auth_user         | 2017-08-10 14:36:41 |   0 |          1 |            1 |
| fdb      | auth_user_groups      | 2017-08-10 14:36:41 |   0 |          1 |            2 |
| fdb      | auth_user_user_permissions | 2017-08-10 14:36:41 |   0 |          1 |            2 |
| fdb      | cninfo_company       | 2017-08-10 14:36:58 |  4996 |         161 |            6 |
| fdb      | csindex_indexdetail    | 2017-09-17 14:04:27 |   0 |          1 |            0 |
| fdb      | csindex_indexoverview   | 2017-09-01 12:44:18 |   11 |          1 |            0 |
| fdb      | django_admin_log      | 2017-08-10 14:36:47 |   0 |          1 |            2 |
| fdb      | django_content_type    | 2017-08-10 14:36:47 |   10 |          1 |            1 |
| fdb      | django_migrations     | 2017-09-04 14:04:09 |   37 |          1 |            0 |
| fdb      | django_session       | 2017-08-10 14:36:47 |   0 |          1 |            1 |
| fdb      | glod_glodprice       | 2017-08-10 14:36:48 |  2271 |          10 |            0 |
| fdb      | pbc_moneysupply      | 2017-08-10 14:37:08 |   78 |          1 |            0 |
| fdb      | shibor_shiborrate     | 2017-08-10 14:37:18 |  2711 |          14 |            0 |
| fdb      | sse_marketoverview     | 2017-08-15 16:06:12 |   0 |          1 |            0 |
| mysql     | gtid_executed       | 2017-09-06 11:02:14 |   2 |          1 |            0 |
| sys      | sys_config         | 2017-08-10 12:19:06 |   6 |          1 |            0 |
| tempdb    | person           | 2017-09-14 11:18:15 |   1 |          1 |            0 |
| tmp      | t             | 2017-08-15 11:06:18 |   2 |          1 |            0 |
+---------------+----------------------------+---------------------+--------+----------------------+--------------------------+
21 rows in set (0.00 sec)

  各个列所代表的意义:

  database_name        表所在的库名

  table_name          表名

  last_update          最近一次的更新时间

  n_rows            表中的行数

  clustered_index_size       主键的大小

  sum_of_other_index_sizes   所有二级索引的大小

 六、一些在analyze table 过程中的经验:

  如果我们用explan 语句查看SQL的执行计划的时候发现,计划走的不准,多半是由于统计信息过时引起的,这个

  时候就要执行一下analyze table 来重新生成一下执行计划了;有时候可能发现重新生成执行计划后并没有什么用

  SQL还是走的不准,这个时候最可能的原因就是生成执行计划时的采样页的数量太低了,innodb_stats_persistent_sample_pages

  这个参数的值,注意这个值也不要加的太大,要不然会老半天都执行不完analyze table 语句。  

七、附加说明:

  上文中说的mysql实际上指的只是Innodb这个引擎

以上就是详解mysql持久化统计信息的详细内容,更多关于mysql持久化统计信息的资料请关注脚本之家其它相关文章!

相关文章

  • 通过mysql show processlist 命令检查mysql锁的方法

    通过mysql show processlist 命令检查mysql锁的方法

    show processlist 命令非常实用,有时候mysql经常跑到50%以上或更多,就需要用这个命令看哪个sql语句占用资源比较多,就知道哪个网站的程序问题了。
    2010-03-03
  • mysql中url时区的陷阱该如何规避详解

    mysql中url时区的陷阱该如何规避详解

    最近在工作中发现一个问题,是关于mysql中url时区的,发现这个陷阱如果大家不注意可能都会遇到,所以给大家总结下,这篇文章主要给大家介绍了关于mysql中url时区的陷阱该如何规避的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-08-08
  • 详解MySQL substring() 字符串截取函数

    详解MySQL substring() 字符串截取函数

    MySQL 查询数据有时候需要对数据项进行日期格式化或截取特定部分的操作,当需要对字符串进行截取加工时用到了 substring() 函数,这篇文章主要介绍了MySQL substring() 字符串截取函数,需要的朋友可以参考下
    2022-07-07
  • Mysql中复制详细解析

    Mysql中复制详细解析

    这篇文章主要介绍了Mysql中复制详细解析,从基本概念、用途、实现方法以及集中模式进行了介绍,然后分享了具体实现代码,具有一定参考价值,需要的朋友可以了解下。
    2017-10-10
  • PHP中ORDER BY子句的详细用法教程

    PHP中ORDER BY子句的详细用法教程

    这篇文章主要介绍了PHP中ORDER BY子句的详细用法教程,文中提供了PHP脚本下的操作示例,是MySQL入门学习中的基础知识,需要的朋友可以参考下
    2015-05-05
  • mysql密码忘了的问题及解决方案

    mysql密码忘了的问题及解决方案

    这篇文章主要介绍了mysql密码忘了的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • MySQL全文索引、联合索引、like查询、json查询速度哪个快

    MySQL全文索引、联合索引、like查询、json查询速度哪个快

    这篇文章主要介绍了MySQL全文索引、联合索引、like查询、json查询速度大比拼,通过实例代码截图的形式给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02
  • 区分MySQL中的空值(null)和空字符('''')

    区分MySQL中的空值(null)和空字符('''')

    这篇文章主要介绍了如何区分MySQL中的空值(null)和空字符(''),帮助大家更好的理解和使用MySQL数据库,感兴趣的朋友可以了解下
    2020-09-09
  • MySQL 条件查询详解

    MySQL 条件查询详解

    这篇文章主要介绍了MySQL条件查询,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • mysql修改开启允许远程连接的方法

    mysql修改开启允许远程连接的方法

    这篇文章主要为大家详细介绍了mysql修改开启允许远程连接的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08

最新评论