mysql没有主键导致延迟_【转载】备库由于表无主键导致延迟

由于ROW模式的复制已经广泛使用,但对于没有主键的表而言,如果发生大更新,在备库上会表现出极大的延迟,因为在binlog中产生的大量行记录将无法根据主键快速查找,最差的情况,需要对每条修改的记录进行全表扫描。

5.6已经解决了这个问题,可以只扫描一次表;5.5最新的版本只是在错误日志里输出了一些信息。

Port 5.6的实现不太现实,因为改动太大。因此我做了些小改动,对于无主键表上的DELETE/UPDATE,转换为STATEMENT模式的binlog记录。

以下是一个改动非常简单的patch,基于Percona5.5.18

Index: /PS5518/branches/PS-r3633-nopk-logstmt/sql/sys_vars.cc

===================================================================

--- /PS5518/branches/PS-r3633-nopk-logstmt/sql/sys_vars.cc(revision 3639)

+++ /PS5518/branches/PS-r3633-nopk-logstmt/sql/sys_vars.cc(revision 3641)

@@ -396,6 +396,13 @@

CMD_LINE(OPT_ARG), DEFAULT(FALSE),

NO_MUTEX_GUARD, NOT_IN_BINLOG, ON_CHECK(binlog_direct_check));

+static Sys_var_mybool Sys_binlog_use_stmt_for_non_pk(

+ "binlog_use_stmt_for_non_pk",

+ "if a table doesn't have primary key ,then log the changes (SQLCOM_DELETE"

+ "and SQLCOM_UPDATE) using STATEMENT.",

+ SESSION_VAR(binlog_use_stmt_for_non_pk),

+ CMD_LINE(OPT_ARG), DEFAULT(FALSE));

+

static Sys_var_ulong Sys_bulk_insert_buff_size(

"bulk_insert_buffer_size", "Size of tree cache used in bulk "

"insert optimisation. Note that this is a limit per thread!",

Index: /PS5518/branches/PS-r3633-nopk-logstmt/sql/sql_class.h

===================================================================

--- /PS5518/branches/PS-r3633-nopk-logstmt/sql/sql_class.h(revision 3639)

+++ /PS5518/branches/PS-r3633-nopk-logstmt/sql/sql_class.h(revision 3641)

@@ -492,6 +492,7 @@

ulong binlog_format; ///< binlog format for this thd (see enum_binlog_format)

my_bool binlog_direct_non_trans_update;

+ my_bool binlog_use_stmt_for_non_pk;

my_bool sql_log_bin;

ulong completion_type;

ulong query_cache_type;

Index: /PS5518/branches/PS-r3633-nopk-logstmt/sql/sql_class.cc

===================================================================

--- /PS5518/branches/PS-r3633-nopk-logstmt/sql/sql_class.cc(revision 3639)

+++ /PS5518/branches/PS-r3633-nopk-logstmt/sql/sql_class.cc(revision 3641)

@@ -4495,10 +4495,14 @@

Get the capabilities vector for all involved storage engines and

mask out the flags for the binary log.

*/

+ my_bool table_no_key= false;

for (TABLE_LIST *table= tables; table; table= table->next_global)

{

if (table->placeholder())

continue;

+

+ if (table->table->s->primary_key >= MAX_KEY)

+ table_no_key= true;

if (table->table->s->table_category == TABLE_CATEGORY_PERFORMANCE ||

table->table->s->table_category == TABLE_CATEGORY_LOG)

@@ -4680,6 +4684,13 @@

/* log in row format! */

set_current_stmt_binlog_format_row_if_mixed();

}

+ /*if there is a table without any primary key,log in stmt format*/

+ else if (table_no_key &&

+ (variables.binlog_use_stmt_for_non_pk) &&

+ (variables.binlog_format == BINLOG_FORMAT_ROW ) &&

+ (lex->sql_command == SQLCOM_DELETE ||

+ lex->sql_command == SQLCOM_UPDATE))

+ clear_current_stmt_binlog_format_row();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值