MySQL 的扫描行数是通过索引统计列(cardinality)大致得到并且判断的,而索引统计列(cardinality)可以通过查询命令 show index 得到,索引扫描行数的多少就是通过这个值进行判断的。
MySQL通过使用统计信息来估计索引扫描的行数。统计信息是关于表和索引的数据分布和特征的收集信息,包括行数、唯一值数量、索引长度等。
MySQL中的统计信息是通过收集和存储在特殊系统表中的数据来获取的。主要涉及两个系统表:information_schema.statistics
和mysql.stats
。这些表中的统计信息会定期更新,可以通过手动触发ANALYZE TABLE
或自动的统计信息收集器来进行更新。统计信息的收集和更新过程可以通过配置参数进行调整。
当MySQL优化器需要估计索引扫描的行数时,它会参考相应索引的统计信息。根据统计信息中的行数和选择性等指标,优化器可以推断出索引扫描的行数。
例如,对于一个等值查询,优化器可以使用索引上的选择性估计来确定匹配行数的期望值。如果索引列的选择性很高,即唯一值数量相对总行数较少,优化器可能会认为匹配行数较少。相反,如果选择性较低,即唯一值数量接近总行数,优化器可能会估计匹配行数较多。
对于范围查询,优化器可能会结合索引的选择性和统计信息中的行数来估算范围内的行数。如果索引列上的选择性很高,并且范围查询的范围较小,优化器可能会假设范围内的行数也较少。
需要注意的是,统计信息的准确性对于优化器的估计非常重要。如果统计信息过期或不准确,优化器的估计可能会有偏差,导致选择不合适的执行计划。因此,及时更新和维护统计信息对于查询性能的优化是很重要的。