mysql5.7官网直译优化和索引--索引统计的收集

来源:互联网 发布:淘宝二手回收在哪里 编辑:程序博客网 时间:2024/05/16 01:13
8.3.7 InnoDB and MyISAM Index Statistics Collection 索引统计收集
存储引擎收集统计关于使用了优化策略的表。表统计是基于值分组的,其中一个组的值都是基于相同的key前缀值。而对于优化器的作用,一个重要的统计是平均组值的大小。
mysql使用组大小的平均值在如下地方:
>为了评估每一个ref方法必须要读取多少行数据
>为了评估一个部分的连接将会产生多少行数据;也就是说,一个这种形式的操作会产生多少行的数据:(...) JOIN tbl_name ON tbl_name.key = expr
当组值的平均大小对于一个索引是增加的,索引对于这样的两个目的是没有啥用因为每行的查找数量都在增加:通过索引来达到很好的优化目的,它最好是对于每一个索引值在表中都有很少数量的行。当给出一个值会产生大量的行,索引的作用会很小并且mysql可能不会使用它。
组值的平均数量和表的基数相关,也就是组值的数量。SHOW INDEX 语句展示了一个基数值基于N/S,其中N是表中的行数,S是组值的平均数。这个比例就是表中组数的大概数量。
对于一个基于<=>操作的连接,NULL 不会区别对待从其他值中:NULL<=>NULL,就像N<=>N对于其他N。
然而,一个基于=操作的连接。NULL 是不同于non-NULL值的:expr1=expr2不是true,当expr1或者是expr2(或者两个都是)是NULL。这影响了ref方法对于比较形式为tb1_name.key=expr:mysql将不会访问表,如果当前表达式expr是NULL,因为对比不可能是true.
对于=比较,它不会匹配有多少NULL值在表中。因为优化的目的,相关值是一个平均了non-NULL值的组值的平均大小。然而,mysql不能立即使用或者是收集平均大小。
对于InnoDB和MyISAM表,你能有一些控制关于表统计的收集,方法是innodb_stats_method和myisam_stats_method系统变量。这些变量可能有三个值,他们分别如下:
1)当变量的值设置为nulls_equal,所有的NULL值被单独处理(也就是说,他们所有的值形成一个组);
  如果null值组的大小远大小非null值组的平均大小,那么这种方法会使得平均组大小变大。这可能使得索引对优化器的作用并没有他实际在连接中的作用大对于查找非null值。所以,nulls_equal方法可能使得优化器不使用索引在ref方法中,虽然它应该被使用。
2)当变量的值设置为nulls_unequal,NUll值不会被相同的对待。而是,每个NULL值都是独立的一个组且组内的数目为1.
3)当变量的值设置为nulls_ignored,Null值会被忽略。
如果你更倾向于使用多个连接使用<=>而不是=,NULL值是不会被单独对比的并且NUll值之间是相等的。在这种情况下,nulls_equal是一个不错的统计方法。
系统变量innodb_stats_method是一个全局变量;系统变量myisam_stats_method即是全局的又是session的值。设置全局的变量值会影响当前存储引擎上的所有表的统计集合。设置session值只会影响当前连接中的统计值。这也就意味着你可以通过设置session值关于myisam_stats_method的变量来强制更新表统计给出的方法,而不影响其他客户端的操作。
为了更新myISAM表统计,你能使用下面的方法:
>执行myisamchk --stats_method=method_name --analyze命令
>通过改变表来引发统计表的方法已经过时(例如插入数据或是删除数据),并且设置myisam_stats_method和发起一个ANALYZE_TABLE 语句。
一些警告关于使用innodb_stats_method和myisam_stats_method:
1)你能明确的强制表统计被收集,就像先前描述的一样。然而,mysql也可以自动收集统计数据。例如如果在对一张表执行语句的过程中,一些其他语句修改了表,mysql也许会收集统计。(这也许发生在大量插入或者删除,或者是一些修改表的语句)如果中发生了,不管innodb_stats_method或者myisam_stats_method是什么值,统计都会被及时的收集。这样,如果你收集统计数据使用一个方法,但是系统变量设置为另一个方法在表统计收集是自然使用,其他方法会被使用。
2)没有办法知道哪一个方法会被使用产生统计对于一个给出的表
3)这些变量只能拿应用在innoDB和MyISAM表中。其他存储引擎只有一种方法收集表的统计数据。通常是关闭的关于方法nulls_equal。
关于索引统计信息的收集到这里就结束了,接下来我们要说的是8.3.8 Comparison of B-Tree and Hash Indexes B-Tree索引和哈希索引的对比。
阅读全文
0 0
原创粉丝点击