June 20, 2013

[MySQL 5.6] 5.6新参数slave_rows_search_algorithms

我们知道,MySQL有一个老问题,当表上无主键时,那么对于在该表上做的DML,如果是以ROW模式复制,则每一个行记录前镜像在备库都可能产生一次全表扫描(或者二级索引扫描),大多数情况下,这种开销都是非常不可接受的,并且产生大量的延迟。 在MySQL5.6中提供了一个新的参数:slave_rows_search_algorithms, 可以部分解决无主键表导致的复制延迟问题,其基本思路是对于在一个ROWS EVENT中的所有前镜像收集起来,然后在一次扫描全表时,判断HASH中的每一条记录进行更新。 测试: 首先来看看性能怎么样,我们使用sbtest表,并将其上面的主键及二级索引全部删除,表中有200万行数据 主库执行随机更新操作:      update table sbtest2 set k = k +15 order by rand() limit  [$RECOR_NUM];  备库的最大延迟时间(基本等同执行时间)如下: 随机更新记录数 TABLE_SCAN,INDEX_SCAN TABLE_SCAN,INDEX_SCAN,HASH_SCAN 10 26s 6s 20 51s 9s 40 96s 15s 60 147s 25s 80 187s 30s 100 228s 37s 可以看出来,该特性对于无主键表的复制延迟问题,还是有很大的帮助的。 如何使用: slave_rows_search_algorithms的文档描述的非常清晰,该变量由三个值的组合组成:TABLE_SCAN,INDEX_SCAN, HASH_SCAN,使用组合包括: TABLE_SCAN,INDEX_SCAN  (默认配置,表示如果有索引就用索引,否则使用全表扫描) INDEX_SCAN,HASH_SCAN TABLE_SCAN,HASH_SCAN TABLE_SCAN,INDEX_SCAN,HASH_SCAN(等价于INDEX_SCAN, HASH_SCAN) 参数组合(摘自log_event.cc: […]