8.3.7 InnoDB and MyISAM Index Statistics Collection InnoDB 和MyISAM 索引统计信息搜集
average value group size :就是一组有相同key 前缀值的记录集
存储引擎搜集搜集表的统计信息通过优化器, 表的统计信息是基于value groups,
一个 value group 是一组极有相同 前缀值的key. 对于优化目的,一个重要的统计是average value group size.
MySQL 使用平均值在下面几个方面:
- 评估每次访问需要读取多少行
2.评估一个部分连接会产生多少行, 也就是说,这种形式的操作会产生多少记录:
(…) JOIN tbl_name ON tbl_name.key = expr
由于一个平均值组大小对于一个索引增加, 该索引是不太可用的,因为这2个目的,
因为每次查找平均的记录数增加, 对于索引最好的优化目的, 最好是每个索引值目标表中的一个小的记录,
当给定的一个索引值产生一个大的记录率,MySQL不大会使用这个索引。
平均值组的大小和表的基数有关, SHOW INDEX 语句显示了给予N/S 的基数,N为表中的行数,S是 平均值组大小,
对于一个连接基于<=> 比较运算符,NULL 没有不同对待和任何其他的值,NULL <=> NULL, just as N <=> N for any other N.
然而, 对于一个join 基于=操作符,NULL 是不同于non-NULL 值的
expr1 = expr2 是不正确的 当expr1 或者expr2(或者2者)是NULL.
对于=比较,它不关心有多少NULL值在表中。 对于优化目的,相关值是非NULL 值组的平均值。然而,
MySQL 目前不启用 搜集和使用平均值
对于InnoDB 和MyISAM 表,你可以控制通过收集表的统计信息使用innodb_stats_method and myisam_stats_method,
这些变量有三个可能的值,不同如下:
当变量被设置为nulls_equal, 所有的NULL值被视为相同的(即,它们形成一个单独的值组)
如果NULL 值组大小是比非空值组更高,这种方法将平均值组的大小上。这个使得索引显示出的优化变得不是很有用
因此,该nulls_equal方法可能导致优化器不使用索引访问时,应参考。
3.当变量设置为nulls_unequal,NULL 值不认为是一样的,代替的是,每一个NULL值形成一个单独的值组
4.如果你有很多的空值, 该方法将平均值组大小下降。如果平均的非空值组大小是大的,计数空值作为一组大小1导致的优化,高估的索引的值加入,寻找非空值。因此,该nulls_unequal方法可能会导致优化器使用该指标作为参考查找在其他方法可能会更好。
- 当变量被设置为nulls_ignored,NULL 值被忽略
如果你倾向于使用多个join ,使用<=> 相比=,NULL值不是特别在比较,一个NULL 是等于另一个。
在这种情况下, nulls_equal 是合适的统计方法。
innodb_stats_method 系统变量只有一个全局值,myisam_stats_method 系统变量有全局和会话值。
设置全局值 影响统计信息的搜集。
设置 session 值会 影响当前客户端连接的统计信息。
这意味着你可以强制让表的统计信息重启搜集,通过设置session级别的myisam_stats_method。
重新搜集 MyISAM table statistics, 你可以使用下面的方法:
1.执行 myisamchk –stats_method=method_name –analyze
2.更改表使它的统计信息过期(比如, 插入数据然后删除它).
然后设置 myisam_stats_method 执行ANALYZE TABLE 语句。
关于innodb_stats_method和myisam_stats_method使用的一些注意事项:
你可以强制搜集表的统计信息,如刚才描述。然而,MySQL也可以自动的收集统计信息。
例如, 在你在表上执行语句的过程中,有些语句可能会修改表,MySQL 可以搜集统计信息。
(这个可能出现在批量插入和删除,或者ALTER TABLE 语句)
1.如果这种情况发生, 统计信息被搜集不管 innodb_stats_method or myisam_stats_method是什么值。
2.没有办法告诉使用哪种方式来生成统计信息对于指定的表
3.这些变量只适用于InnoDB和MyISAM表, 其他的存储引起只有一种方式来搜集表统计信息,它通常是更接近nulls_equal方法。