对于InnoDB和MyISAM 表,分别可以通过innodb_stats_method和 myisam_stats_method系统变量来控制对表统计信息的收集 。这些变量具有三个可能的值,其区别如下:
- (默认)当变量设置为时nulls_equal,所有NULL值都被视为相同(也就是说,它们全部形成一个值组)。
如果NULL值组大小远大于平均非NULL值组大小,则此方法会使平均值组大小向上倾斜。这使得索引在优化器中似乎没有那么有用,而对于查找非NULL值的联接而言,索引的作用实际上
不那么有用。因此,该 nulls_equal方法可能会导致优化器ref在应该使用索引时不使用索引。
理解:假设库中有20w条数据,假设表中没有NULL值的时候,省这个字段索引,
并且假设每个省的数据量大小是一样的。
基数理论上是34,则总体的平均值组大小为 20w/34 约为 5882
当库中有NULL值之后,假设把其中2W个省变为NULL,此时满足条件——NULL值组大小远大于平均非NULL值组大小
NULL值组大小为 2w
非NULL值的平均值组大小为:18w/34 = 5294
则总体上的平均值组大小为: (20000 + 5294)/2 = 12647
直接变成理想状态下的2倍。
MySQL在选取索引的时候。发现这个12647平均值组太大,可能就放弃使用该索引。
- 当变量设置为时 nulls_unequal,NULL 值将被认为是不同的。而是,每个 NULL值形成一个单独的大小为1的值组。
如果您有很多NULL值,则此方法会使平均值组的大小向下倾斜。如果平均