面试题答案
一键面试基本方法
- 采样统计:
- MySQL不会对全表数据进行精确的基数(Cardinality)统计,而是采用采样的方式。它会从表中抽取一定数量的页面(Page)进行统计。例如,InnoDB存储引擎可能会从B - Tree索引中随机选择一些叶子节点页面。
- 采样的页面数量并非固定,会根据表的大小等因素调整。较小的表可能采样比例相对高一些,较大的表采样比例相对低。
- 直方图统计:
- 在采样数据的基础上,MySQL会构建直方图。对于单列索引,它会统计索引列不同值的分布情况。例如,记录每个值出现的次数等信息。
- 对于多列索引,会按照索引列的顺序依次统计不同值组合的分布,这种方式有助于更准确地估计查询涉及多个索引列时的基数。
相关机制
- 统计信息更新机制:
- MySQL不会实时更新Cardinality统计信息。当表数据发生一定量的变化(如插入、删除、更新一定数量的行)时,才会触发统计信息的重新计算。
- 可以使用
ANALYZE TABLE
或OPTIMIZE TABLE
语句手动更新统计信息。ANALYZE TABLE
主要用于更新表的统计信息,包括Cardinality;OPTIMIZE TABLE
除了更新统计信息外,还会对表进行一些优化操作,如整理碎片等。
- 查询优化器对Cardinality的使用:
- 查询优化器在生成执行计划时,会依据Cardinality值来估计不同查询执行路径的成本。例如,在决定是否使用某个索引时,会根据Cardinality估计使用索引和全表扫描哪种方式更高效。
- 如果Cardinality统计不准确,可能导致查询优化器选择次优的执行计划,从而影响查询性能。例如,Cardinality估计过高,可能使优化器选择全表扫描而放弃本应更优的索引访问;Cardinality估计过低,则可能导致优化器选择使用低效的索引。