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 参数来控制更新
统计信息时的采样,样本页面的数量。
- [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 |
- +---------------+----------------------------+---------------------+--------+----------------------+--------------------------+
- | 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-5.7 持久化统计信息详解的更多相关文章
- autotrace执行计划中,统计信息详解
全表扫描是怎么扫描的? oracle最小的存储单位是block 物理上连续的block组成了extent(也就是说一个区中的所有块在物理上是连续的) 很多个extent组成了segment(一个seg ...
- MySQL数据库的各种存储引擎详解
原文来自:MySQL数据库的各种存储引擎详解 MySQL有多种存储引擎,每种存储引擎有各自的优缺点,大家可以择优选择使用: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB ...
- (转)总结之:CentOS 6.5 MySQL数据库的基础以及深入详解
总结之:CentOS 6.5 MySQL数据库的基础以及深入详解 原文:http://tanxw.blog.51cto.com/4309543/1395539 前言 早期MySQL AB公司在2009 ...
- (转)MySQL性能调优my.cnf详解
MySQL性能调优my.cnf详解 https://blog.linuxeye.cn/379.html http://blog.csdn.net/orichisonic/article/details ...
- MySQL的用户密码过期功能详解
MySQL的用户密码过期功能详解 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 先说明两个术语. Payment Ca ...
- MySql绿色版配置及使用详解
原文:MySql绿色版配置及使用详解 最近在做项目开发时用到了MySql数据库,在看了一些有关MySql的文章后,很快就上手使用了.在使用的过程中还是出现了一些问题,因为使用的是绿色免安装版的MySq ...
- MySQL数据库使用mysqldump导出数据详解
mysqldump是mysql用于转存储数据库的实用程序.它主要产生一个SQL脚本,其中包含从头重新创建数据库所必需的命令CREATE TABLE INSERT等.接下来通过本文给大家介绍MySQL数 ...
- 【转】MySQL用户管理及SQL语句详解
[转]MySQL用户管理及SQL语句详解 1.1 MySQL用户管理 1.1.1 用户的定义 用户名+主机域 mysql> select user,host,password from mysq ...
- mysql数据库分区功能及实例详解
分区听起来怎么感觉是硬盘呀,对没错除了硬盘可以分区数据库现在也支持分区了,分区可以解决大数据量的处理问题,下面一起来看一个mysql数据库分区功能及实例详解 一,什么是数据库分区 前段时间写过一篇 ...
随机推荐
- php的error_log()记录日志
<?php date_default_timezone_set('PRC');//设置时区,否则会有警告 //把This s a error保存到/home/log-yyyy-MM-dd.txt ...
- C++中指针和引用、数组之间的区别
指针指向一块内存,它的内容是所指内存的地址:而引用则是某块内存的别名,引用初始化后不能改变指向.使用时,引用更加安全,指针更加灵活. 初始化.引用必须初始化,且初始化之后不能呢改变:指针可以不必初始化 ...
- Cookie文件说明及IE的Cookie文件格式
1.Cookie文件的实质 Cookie实际上是Web服务端与客户端(典型的是浏览器)交互时彼此传递的一部分内容,内容可以是任意的,但要在允许的长度范围之内.客户端会将它保存在本地机器上(如IE便会保 ...
- [笔记] Python字典
好记忆不如烂笔头: #__author:Mifen #date: 2018/11/28 #不可变类型:整型,字符串,浮点型(不等于小数,但包括小数),元组(只读,不可修改) #可变类型:列表,字典(键 ...
- JAVA-6NIO之FileChannel
Java NIO中的FileChannel是一个连接到文件的通道.可以通过文件通道读写文件. FileChannel无法设置为非阻塞模式,它总是运行在阻塞模式下. 打开FileChannel 在使用F ...
- DotNetBar 使用笔记
1.删除表格的某一行数据,必须是VirtualMode = false 的时候才生效,不然就只是灰色 SuperDBG_Right.PrimaryGrid.SetDeletedRows(SuperD ...
- sql中替换换行符和空格的示例
select DiscussID,L.Name as LocationName , C.Name as ClientName, REPLACE(BrandName,' ','') BrandName ...
- Javascript数组操作函数总结
(1) shift 删除原数组第一项,并返回删除元素的值:如果数组为空则返回undefined var a = [1,2,3,4,5]; var b = a.shift(); //a:[2,3,4, ...
- [PHP] 重回基础(date函数和strtotime函数)
date():格式化一个本地时间或者日期,当前时间 2016年5月13日 15:19:49 使用函数date(),输出当前是月份中的第几天,参数:String类型 d 例如:echo date(&qu ...
- 使用Spring自定义注解实现任务路由的方法
在Spring mvc的开发中,我们可以通过RequestMapping来配,当前方法用于处理哪一个URL的请求.同样我们现在有一个需求,有一个任务调度器,可以按照不同的任务类型路由到不同的任务执行器 ...