连接查询的成本
我们前边说过,MySQL中连接查询采用的是嵌套循环连接算法,驱动表会被访问一次,被驱动表可能会被访问多次,所以对于两表连接查询来说,它的查询成本由下边两个部分构成:
1 单次查询驱动表的成本
2多次查询被驱动表的成本(具体查询多少次取决于对驱动表查询的结果集中有多少条记录)
我们把对驱动表进行查询后得到的记录条数称之为驱动表的扇出(英文名:fanout)。很显然驱动表的扇出值越小,对被驱动表的查询次数也就越少,连接查询的总成本也就越低。当查询优化器想计算整个连接查询所使用的成本时,就需要计算出驱动表的扇出值,有的时候扇出值的计算是很容易的
InnoDB以表为单位来收集统计数据,这些统计数据可以是基于磁盘的永久性统计数据,也可以是基于内存的非永久性统计数据。
innodb_stats_persistent控制着使用永久性统计数据还是非永久性统计数据;innodb_stats_persistent_sample_pages控制着永久性统计数据的采样页面数量;innodb_stats_transient_sample_pages控制着非永久性统计数据的采样页面数量;innodb_stats_auto_recalc控制着是否自动重新计算统计数据。
我们可以针对某个具体的表,在创建和修改表时通过指定STATS_PERSISTENT、STATS_AUTO_RECALC、STATS_SAMPLE_PAGES的值来控制相关统计数据属性。
innodb_stats_method决定着在统计某个索引列不重复值的数量时如何对待NULL值。
网友评论