MySQL 5.7 统计信息总结

1.常用SQL

-- 索引
CREATE INDEX idx_name ON test.t1(id,NAME);
ALTER TABLE test.t1 ADD PRIMARY KEY (id);
ALTER TABLE test.t1 DROP INDEX idx_name ;
ALTER TABLE test.t1 DROP PRIMARY KEY ;
SHOW INDEX FROM test.t1;

-- 统计信息
SELECT * FROM mysql.`innodb_index_stats`  WHERE database_name='test';
SELECT * FROM mysql.`innodb_table_stats`  WHERE database_name='test';
-- 索引的统计信息
SELECT TABLE_SCHEMA,table_name,index_name,column_name,CARDINALITY 
   FROM information_schema.STATISTICS WHERE table_schema ='test';
-- 收集统计信息   
ANALYZE TABLE test.t1;
show variables like 'innodb_stats%';

 2.变量意义

mysql> show variables like 'innodb_stats%';
+--------------------------------------+-------------+
| Variable_name                        | Value       |
+--------------------------------------+-------------+
| innodb_stats_auto_recalc             | ON          |
| innodb_stats_include_delete_marked   | OFF         |
| innodb_stats_method                  | nulls_equal |
| innodb_stats_on_metadata             | OFF         |
| innodb_stats_persistent              | ON          |
| innodb_stats_persistent_sample_pages | 20          |
| innodb_stats_sample_pages            | 8           |
| innodb_stats_transient_sample_pages  | 8           |
+--------------------------------------+-------------+
8 rows in set (0.00 sec)
参数名称参数意义

innodb_stats_auto_recalc

是否自动触发更新统计信息。当被修改的数据超过10%时就会触发统计信息重新统计计算

innodb_stats_include_delete_marked

控制在重新计算统计信息时是否会考虑删除标记的记录。

innodb_stats_method

对null值的统计方法

innodb_stats_on_metadata

操作元数据时是否触发更新统计信息

innodb_stats_persistent

统计信息是否持久化

innodb_stats_sample_pages

不推荐使用,已经被innodb_stats_transient_sample_pages 替换

innodb_stats_persistent_sample_pages

持久化抽样page数

innodb_stats_transient_sample_pages

瞬时抽样page数

2.1参数innodb_stats_auto_recalc

该参数innodb_stats_auto_recalc控制是否自动重新计算统计信息,当表中数据有大于10%被修改时就会重新计算统计信息(注意,由于统计信息重新计算是在后台发生,而且它是异步处理,这个可能存在延时,不会立即触发,具体见下面介绍)。如果关闭了innodb_stats_auto_recalc,需要通过analyze table来保证统计信息的准确性。不管有没有开启全局变量innodb_stats_auto_recalc。即使innodb_stats_auto_recalc=OFF时,当新索引被增加到表中,所有索引的统计信息会被重新计算并且更新到innodb_index_stats表上。

2.2 参数innodb_stats_include_delete_marked

重新计算统计信息时是否会考虑删除标记的记录.

innodb_stats_include_delete_marked can be enabled to ensure that delete-marked records are included when calculating persistent optimizer statistics.

网上有个关于innodb_stats_include_delete_marked的建议,如下所示,但是限于经验无法对这个建议鉴定真伪,个人觉得还是选择默认关闭,除非有特定场景真有这种需求。

2.3 参数innodb_stats_method

Specifies how InnoDB index statistics collection code should treat NULLs. Possible values are NULLS_EQUAL (default), NULLS_UNEQUAL and NULLS_IGNORED

当变量设置为nulls_equal时,所有NULL值都被视为相同(即,它们都形成一个 value group)。

当变量设置为nulls_unequal时,NULL值不被视为相同。相反,每个NULL value 形成一个单独的 value group,大小为 1。

当变量设置为nulls_ignored时,将忽略NULL值。

更多详细信息,参考官方文档“InnoDB and MyISAM Index Statistics Collection”,另外,还有一个系统变量myisam_stats_method控制MyISAM表对Null值的统计方法。

2.4 参数innodb_stats_on_metadata

参数innodb_stats_on_metadata在MySQL 5.6.6之前的版本默认开启(默认值为O),每当查询information_schema元数据库里的表时(例如,information_schema.TABLES、information_schema.TABLE_CONSTRAINTS .... )或show table status、SHOW INDEX..这类操作时,Innodb还会随机提取其他数据库每个表索引页的部分数据,从而更新information_schema.STATISTICS表,并返回刚才查询的结果。当你的表很大,且数量很多时,耗费的时间就很长,以致很多经常不访问的数据也会进入Innodb_buffer_pool缓冲池中,造成池污染,关闭这个参数,可以加快对于schema库表访问,同时也可以改善查询执行计划的稳定性(对于Innodb表的访问)。所以从MySQL 5.6.6这个版本开始,此参数默认为OFF。

注意仅当优化器统计信息配置为非持久性时,此选项才生效。这个参数开启的时候,InnoDB会更新非持久统计信息

2.5 参数innodb_stats_persistent

此参数控制统计信息是否持久化,如果此参数启用,统计信息将会保存到mysql数据库的innodb_table_stats和innodb_index_stats表中。从MySQL 5.6.6开始,MySQL默认使用持久化的统计信息,即默认INNODB_STATS_PERSISTENT=ON。 Persistent optimizer statistics were introduced in MySQL 5.6.2 and were made the default in MySQL 5.6.6。设置此参数之后我们就不需要实时去收集统计信息了,因为实时收集统计信息在高并发下可能会造成一定的性能上影响,并且会导致执行计划有所不同。

  另外,我们可以使用表的建表参数(STATS_PERSISTENT,STATS_AUTO_RECALC和STATS_SAMPLE_PAGES子句)来覆盖系统变量设置的值,建表选项可以在CREATE TABLE或ALTER TABLE语句中指定。表上面指定的参数会覆盖全局变量,也就是说优先级要高于全局变量。

2.6 参数innodb_stats_persistent_sample_pages

如果参数innodb_stats_persistent设置为ON,该参数表示ANALYZE TABLE更新Cardinality值时每次采样页的数量。默认值为20个页面。innodb_stats_persistent_sample_pages太少会导致统计信息不够准确,太多会导致分析执行太慢。

2.7 参数innodb_stats_sample_pages 

已弃用. 已用innodb_stats_transient_sample_pages 替代。

2.8参数innodb_stats_transient_sample_pages

innodb_stats_transient_sample_pages控制采样pages个数,默认为8。Innodb_stats_transient_sample_pages可以runtime设置

innodb_stats_transient_sample_pages在innodb_stats_persistent=0的时候影响采样。注意点:

1.若值太小,会导致评估不准

2.若果值太大,会导致disk read增加。

3.会生产很不同的执行计划,因为统计信息不同。

### 回答1: MySQL 5.7是一个流行的关系型数据库管理系统,而Perl是一种功能强大的编程语言。这两者可以搭配使用,来实现对MySQL数据库的访问和操作。 MySQL 5.7提供了一系列的API和驱动程序,允许开发者使用Perl编写的应用程序与数据库进行通信。通过Perl语言可以方便地连接到MySQL数据库,并可以执行各种常见的数据库操作,如查询、插入、更新和删除数据。 在Perl中使用MySQL 5.7,需要使用DBI模块,它是Perl操作数据库的标准接口。通过DBI模块,可以连接到MySQL数据库,并执行各种SQL语句。可以使用DBI的prepare和execute方法来预编译和执行SQL语句,还可以使用fetchrow_array方法获取查询结果。 Perl和MySQL的搭配使用,可以实现各种功能,从简单的查询和更新到复杂的数据处理和报表生成。例如,可以使用Perl编写脚本来读取数据库中的数据,并进行数据分析和处理,也可以将数据导出到其他格式的文件中。 此外,MySQL 5.7和Perl的兼容性良好,可以在Windows、Linux和Mac等操作系统上使用。而且,MySQL 5.7的官方文档提供了丰富的Perl示例代码和教程,方便开发者学习和使用。 总结来说,MySQL 5.7和Perl是很好的组合,通过Perl可以方便地在应用程序中访问和操作MySQL数据库,并且兼容性好,使用灵活。 ### 回答2: MySQL 5.7是一种关系型数据库管理系统,它是由Oracle公司开发和支持的。它具有很多功能和优点,比如可扩展性高、事务支持和丰富的数据类型。Perl是一种通用的脚本语言,它在文本处理方面表现出色,被广泛用于开发Web应用程序和系统管理任务。 MySQL 5.7和Perl可以相互配合使用,以实现各种数据处理和管理任务。Perl提供了很多开发MySQL应用程序所需的模块和工具,可以轻松地连接MySQL数据库,执行查询和操作数据。通过Perl,我们可以编写复杂的脚本来处理和分析大量数据,快速地生成报告和统计信息。 在使用MySQL 5.7和Perl开发应用程序时,我们可以使用Perl提供的数据库模块(比如DBI和DBD::mysql)来连接和操作MySQL数据库。通过这些模块,我们可以轻松地执行SQL查询、插入、更新和删除数据。此外,Perl还提供了很多其他的模块和函数,可以帮助我们更好地管理和处理数据库。 总的来说,MySQL 5.7和Perl是一对强大的组合,可以用于开发各种类型的应用程序和处理数据。无论是在Web开发领域还是在系统管理任务中,它们都展现出了卓越的性能和灵活性。通过结合二者的优势,我们可以轻松地处理和管理大量的数据,实现高效的数据库操作和数据分析。 ### 回答3: MySQL 5.7是一种流行的开源关系型数据库管理系统,它由Oracle开发和维护。它提供了一个稳定、可靠和高效的解决方案,可用于存储和管理大量数据。MySQL 5.7支持多种操作系统,包括Linux、Windows和Mac OS。 Perl是一种功能强大的解释型编程语言,它被广泛用于开发各种类型的应用程序,包括Web开发、系统管理、数据库操作等。Perl语言具有强大的正则表达式功能和灵活的文本处理能力,这使得它成为处理大量数据的理想选择。 MySQL 5.7和Perl可以很好地搭配使用,以满足各种数据库操作需求。Perl提供了一些MySQL相关的模块,如DBI(Database Interface)和DBD(Database Driver),可以方便地连接、查询和处理MySQL数据库。 使用Perl连接MySQL数据库非常简单。首先,我们需要安装相关的Perl模块,如DBI和DBD::mysql。然后,我们可以使用DBI模块提供的接口,通过指定数据库的连接参数来连接到MySQL数据库。一旦连接成功,就可以使用Perl编写SQL查询语句,并使用DBI模块提供的方法执行查询操作。查询结果可以以数组或哈希的形式返回,方便我们进行后续处理。 除了基本的查询操作,Perl还可以通过DBI模块提供的接口执行其他数据库操作,如插入数据、更新数据和删除数据等。我们可以使用Perl的循环和条件语句结合MySQL的语法来实现复杂的数据库操作。此外,Perl还支持事务处理,可以确保在多个数据库操作中的一致性。 综上所述,MySQL 5.7和Perl是一对强大的组合,可以实现各种复杂的数据库操作。无论是开发Web应用、系统管理还是处理大量数据,MySQL 5.7和Perl都能提供高效、稳定和灵活的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值