update/recalc the stats if they have
not been initialized yet, otherwise
do nothing */
ibool only_calc_if_changed_too_much)/*!< in: only
update/recalc the stats if the table
has been changed too much since the
last stats update/recalc */
{
dict_index_t* index;
ulint sum_of_index_sizes = 0;
DBUG_EXECUTE_IF("skip_innodb_statistics", return;);
-----------------------------------------------------------------------------
可以优化成:
1) 加x锁
2) 索引统计
3) stat_modified_counter 置0
4) 解锁
---------------------------------------------------------------------------
二.MySQL 5.6的改进:
可以配置统计信息的持久化和非持久化(非持久化:5.6之前都是这种)
相关参数:
持久化:
innodb_stats_persistent:on(1)
innodb_stats_persistent_sample_pages:20
非持久化:
innodb_stats_sample_pages:8
相关表:
mysql.innodb_index_stats
mysql.innodb_table_stats
From 5.6.6 开始,统计信息默认是持久化的(即innodb_stats_persistent=on),使用参数innodb_stats_persistent_sample_pages的值,来采样,此时非持久化的参数innodb_stats_sample_pages就无效。
From 5.6.6 开始,使用非持久化的统计信息:
1.set innodb_stats_persistent=0;
2.create|alter table stats_persistent=0;
对单个表开启:
create|alter table...STATS_PERSISTENT [=] {DEFAULT|0|1}DEFAULT:table的统计信息是否持久化由参数 innodb_stats_persistent 决定。\
总结:From 5.6.6 开始,要么开启统计信息持久化,要么是还用以前的非持久化,二者选一。
参考相关参数:
innodb_stats_method: nulls_equal, nulls_unequal, and nulls_ignored
myisam_stats_method:nulls_equal, nulls_unequal, and nulls_ignored
--------------------------------------------------------------
基数即value group=N/s (N:表行数 S:average group size)
基数(VG)|值组为不重复的值的个数
nulls_equal:所有的NULL都相等,算作一个值组,这样一旦null值很多的情况下,average group size偏大,导致基数偏小。
nulls_unequal:每一个NULL都相等,算作一个值组,这样一旦null值很多的情况下,如果non-null值组大,而null的值组过多,导致average group size偏小,导致基数偏大,可能导致误走索引
nulls_ignored:所有的null都忽略,不记录索引。
--------------------------------------------------------------
--------------------------------------分割线 --------------------------------------
用mysqldump和mysqlbinlog的MySQL数据恢复实验
Ubuntu 14.04下安装MySQL