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持久化统计信息

本文地址: http://www.cppcns.com/shujuku/mysql/367122.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker是一个开放源代码的虚拟化平台,能够以容器的形式打包和分发应用程序。MySQL是一种流行的开源关系型数据库管理系统。使用Docker部署MySQL可以极大简化安装和配置的过程,并且能够实现数据的持久化。 首先,我们需要在Docker上搜索并选择适合的MySQL镜像。可以通过运行`docker search mysql`命令来查找可用的MySQL镜像。选择合适的镜像后,可以通过`docker pull <镜像名称>`来下载镜像,例如`docker pull mysql:latest`。 下载完成后,我们可以运行以下命令来创建一个MySQL容器: ``` docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=your_password -d mysql:latest ``` 这个命令将会创建一个名为mysql的容器,并将MySQL服务的默认端口3306映射到宿主机的3306端口。同样,我们可以设置一个root密码,让MySQL服务有一个基本的访问控制。 这样,MySQL容器就成功运行起来了。我们可以通过`docker ps`命令来查看正在运行的容器。接下来,我们可以使用MySQL客户端连接到该容器。可以通过以下命令登录到MySQL容器内部的MySQL服务: ``` docker exec -it mysql mysql -uroot -p ``` 然后,我们可以在MySQL容器内部使用标准的MySQL命令来管理和操作数据库。 要实现数据的持久化,我们可以将MySQL容器内部的数据目录和宿主机的目录进行挂载。可以使用`-v`参数来指定目录的挂载点。例如: ``` docker run -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=your_password -v /path/to/mysql/data:/var/lib/mysql -d mysql:latest ``` 这将会将MySQL容器内部的`/var/lib/mysql`目录与宿主机上的`/path/to/mysql/data`目录进行挂载,从而实现数据的持久化。 通过以上步骤,我们可以使用Docker部署MySQL,并且实现数据的持久化。这样,我们可以方便地在不同的环境之间快速部署和迁移MySQL数据库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值