InnoDB and MyISAM Index Statistics Collection

本文涉及的产品
云原生数据库 PolarDB 分布式版,标准版 2核8GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 存储引擎收集表统计信息,供优化器使用,关键数据为平均值组大小,反映相同键前缀值的行数均值。该值影响索引效率,值越大,索引查找行数越多,效用越低。MySQL通过调整`innodb_stats_method`和`myisam_status`系统变量控制统计方法,涉及NULL值处理,如nulls_equal将所有NULL视为同一值组,可能影响索引使用决策。通过设置变量可优化统计信息收集,提升查询性能。

存储引擎收集有关表的统计信息,供优化器使用。表统计基于值组,其中值组是一组具有相同键前缀值的行。出于优化器的目的,一个重要的统计数据是平均值组大小。
MySQL使用平均值组大小的方式如下:
估计每次ref访问必须读取多少行
估计部分连接产生多少行;也就是说,这种形式的操作产生的行数:

随着索引的平均值组大小的增加,该索引对这两个目的的用处较小,因为每次查找的平均行数增加:为了使索引有利于优化,最好每个索引值都针对表中的少量行。当一个给定的索引值产生大量行时,该索引就不那么有用了,MySQL也不太可能使用它。
平均值组大小与表基数有关,表基数是值组的数量。SHOW INDEX语句显示基于N/S的基数值,其中N是表中的行数,S是平均值组大小。该比率得出表中价值组的大致数量。
对于基于<=>比较运算符的连接,NULL的处理方式与任何其他值没有区别:NULL<=>NULL,就像N<=>N对任何其他N一样。
但是,对于基于=运算符的连接,NULL与非NULL值不同:当expr1或expr2(或两者)为NULL时,expr1=expr2不为真。这会影响tbl_name.key=expr形式的比较的ref访问:如果expr的当前值为NULL,MySQL不会访问该表,因为比较不能为真。
For=比较,表中有多少NULL值并不重要。出于优化目的,相关值是非NULL值组的平均大小。但是,MySQL目前无法收集或使用该平均大小。
对于InnoDB和MyISAM表,您可以分别通过InnoDB_stats_method和MyISAM_status系统变量来控制表统计信息的收集。这些变量有三个可能的值,其差异如下:

当变量设置为nulls_equal时,所有NULL值都被视为相同的(也就是说,它们都形成一个值组)。
如果NULL值组的大小远高于平均非NULL值组大小,则此方法会使平均值组大小向上倾斜。这使得在优化器看来,索引对于查找非NULL值的连接来说,并没有真正有用。因此,nulls_equal方法可能会导致优化器在应该使用索引进行ref访问时不使用索引。
当变量设置为nulls_incequal时,NULL值不被视为相同。相反,每个NULL值形成一个大小为1的单独值组。
如果有许多NULL值,此方法会使平均值组大小向下倾斜。如果平均非NULL值组大小较大,将每个NULL值计数为大小为1的组会导致优化器高估查找非NULL值的联接的索引值。因此,当其他方法可能更好时,nulls_incequal方法可能会导致优化器使用此索引进行引用查找。
当变量设置为nulls_ignored时,NULL值将被忽略。

如果你倾向于使用许多使用<=>而不是=的连接,那么NULL值在比较中并不特殊,一个NULL值等于另一个NULL。在这种情况下,nulls_equal是适当的统计方法。

innodb_stats_method系统变量具有全局值;myisam stats method系统变量具有全局值和会话值。
设置全局值会影响从相应存储引擎中收集表的统计信息。设置会话值仅影响当前客户端连接的统计信息收集。
这意味着您可以通过设置myisam_sets_method的会话值,强制使用给定的方法重新生成表的统计信息,而不会影响其他客户端。
要重新生成MyISAM表统计信息,可以使用以下任何方法:

image.png

更改表以使其统计信息过期(例如,插入一行然后删除它),然后设置myisam_status方法并发出ANALYZE table语句

关于使用innodb_stats_method和myisam_states_method的一些注意事项:
您可以强制显式收集表统计信息,如上所述。然而,MySQL也可能自动收集统计数据。
例如,如果在执行表的语句的过程中,其中一些语句修改了表,MySQL可能会收集统计数据。(例如,这可能发生在批量插入或删除,或某些ALTER TABLE语句中。)
如果发生这种情况,则使用innodb_stats_method或myisam_status _method当时的任何值收集统计数据。
因此,如果您使用一种方法收集统计信息,但在稍后自动收集表的统计信息时将系统变量设置为另一种方法,则使用另一种方式。
无法判断使用哪种方法为给定的表生成统计数据。
这些变量仅适用于InnoDB和MyISAM表。其他存储引擎只有一种收集表统计信息的方法。通常它更接近于nulls_equal方法。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
9月前
|
存储 安全 关系型数据库
|
9月前
|
存储 缓存 关系型数据库
MySQL - 存储引擎MyISAM和Innodb
MySQL - 存储引擎MyISAM和Innodb
115 0
|
9月前
|
存储 关系型数据库 MySQL
MySQL引擎对决:深入解析MyISAM和InnoDB的区别
MySQL引擎对决:深入解析MyISAM和InnoDB的区别
2049 0
|
4月前
|
存储 关系型数据库 MySQL
什么是MyISAM和InnoDB
【10月更文挑战第17天】什么是MyISAM和InnoDB
85 0
|
2月前
|
存储 缓存 关系型数据库
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
MySQL的存储引擎是其核心组件之一,负责数据的存储、索引和检索。不同的存储引擎具有不同的功能和特性,可以根据业务需求 选择合适的引擎。本文详细介绍了MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案。
【MySQL进阶篇】存储引擎(MySQL体系结构、InnoDB、MyISAM、Memory区别及特点、存储引擎的选择方案)
|
2月前
|
存储 关系型数据库 MySQL
“COUNT(*) MyISAM比InnoDB更快”是误解
在我印象中,MyISAM的查询速度比InnoDB快,但根据MySQL官网文章,从5.7版本开始,InnoDB性能大幅提升,在8.0中持续优化。InnoDB提供更好的性能、可靠性和可扩展性,支持ACID事务、行级锁定、崩溃恢复等特性,成为现代应用的默认选择。尤其在高可用性和灾难恢复方面,InnoDB是唯一选择。云服务也普遍不支持MyISAM。因此,建议使用MyISAM的用户尽早迁移到InnoDB以获得更佳性能和可靠性。
62 11
|
9月前
|
存储 SQL 关系型数据库
MySQL存储引擎之MyISAM和InnoDB
MySQL存储引擎之MyISAM和InnoDB
84 0
|
2月前
|
存储 关系型数据库 MySQL
Mysql索引:深入理解InnoDb聚集索引与MyisAm非聚集索引
通过本文的介绍,希望您能深入理解InnoDB聚集索引与MyISAM非聚集索引的概念、结构和应用场景,从而在实际工作中灵活运用这些知识,优化数据库性能。
240 7
|
2月前
|
存储 关系型数据库 MySQL
MySQL引擎InnoDB和MyISAM的区别?
InnoDB是MySQL默认的事务型存储引擎,支持事务、行级锁、MVCC、在线热备份等特性,主索引为聚簇索引,适用于高并发、高可靠性的场景。MyISAM设计简单,支持压缩表、空间索引,但不支持事务和行级锁,适合读多写少、不要求事务的场景。
83 9
|
3月前
|
安全 关系型数据库 数据库
MyISAM和InnoDB的区别
InnoDB支持事务,MyISAM不支持 InnoDB支持外键,MyISAM不支持 InnoDB是聚簇索引,MyISAM是非聚簇索引 InnoDB支持行锁和表锁,MyISAM只支持表锁;【并发情况下,InnoDB性能更牛,默认一锁只会锁住一行数据】 InnoDB不支持全文索引,MyISAM支持 InnoDB支持自增和MVCC模式的读写,MyISAM不支持 InnoDB支持支出数据库异常崩溃后的安全恢复,MyISAM不支持【崩溃后,重启会保证数据恢复到崩溃前状态。这个恢复的过程依赖于redo.log】