没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
试读
3页
InnoDB在写密集的压力时,由于B-Tree扩展,因而也会带来数据文件的扩展,然而,InnoDB数据文件扩展需要使用mutex保护数据文件,这就会导致波动。 丁奇的博客说明了这个问题:When InnoDB under heavy write workload, datafiles will extend quickly, because of B-Tree allocate new pages. But InnoDB need to use mutex to protect datafile, so it will cause performance jitter. Xiaobin Lin
资源推荐
资源详情
资源评论
mysql InnoDB建表时设定初始大小的方法建表时设定初始大小的方法
InnoDB在写密集的压力时,由于B-Tree扩展,因而也会带来数据文件的扩展,然而,InnoDB数据文件扩展需要使用mutex保
护数据文件,这就会导致波动。 丁奇的博客说明了这个问题:
When InnoDB under heavy write workload, datafiles will extend quickly, because of B-Tree allocate new pages. But InnoDB
need to use mutex to protect datafile, so it will cause performance jitter. Xiaobin Lin said this in his blog:
解决的方法也很简单,只要知道数据文件可能会增长到多大,预先扩展即可。阅读代码可以知道,InnoDB建表后自动初始化
大小是FIL_IBD_FILE_INITIAL_SIZE这个常量控制的,而初始化数据文件是由fil_create_new_single_table_tablespace()函数
控制的。所以要改变数据文件初始化大小,只要修改fil_create_new_single_table_tablespace的传入值即可,默认是
FIL_IBD_FILE_INITIAL_SIZE。
How to solve it? That’s easy. If we know the datafile will extend to which size at most, we can pre-extend it. After reading
source code, we can know InnoDB initial datafile size by FIL_IBD_FILE_INITIAL_SIZE, and
fil_create_new_single_table_tablespace() function to do it. So if we want to change datafile initial size, we only need to
change the initial size parameter in fil_create_new_single_table_tablespace(), the default value is
FIL_IBD_FILE_INITIAL_SIZE.
因此,我在建表语法中加上了datafile_initial_size这个参数,例如:
CREATE TABLE test (
…
) ENGINE = InnoDB DATAFILE_INITIAL_SIZE=100000;
如果设定的值比FIL_IBD_FILE_INITIAL_SIZE还小,就依然传入FIL_IBD_FILE_INITIAL_SIZE给
fil_create_new_single_table_tablespace,否则传入datafile_initial_size进行初始化。
So, I add a new parameter for CREATE TABLE, named ‘datafile_initial_size’. For example:
CREATE TABLE test (
…
) ENGINE = InnoDB DATAFILE_INITIAL_SIZE=100000;
If DATAFILE_INITIAL_SIZE value less than FIL_IBD_FILE_INITIAL_SIZE, I will still pass FIL_IBD_FILE_INITIAL_SIZE to
fil_create_new_single_table_tablespace(), otherwise, I pass DATAFILE_INITIAL_SIZE value to
fil_create_new_single_table_tablespace() function for initialization.
因此,这个简单安全的patch就有了,可以看 http://bugs.mysql.com/bug.php?id=67792 关注官方的进展:
So, I wrote this simple patch, see http://bugs.mysql.com/bug.php?id=67792:
代码如下:
Index: storage/innobase/dict/dict0crea.c
===================================================================
— storage/innobase/dict/dict0crea.c (revision 3063)
+++ storage/innobase/dict/dict0crea.c (working copy)
@@ -294,7 +294,8 @@
error = fil_create_new_single_table_tablespace(
space, path_or_name, is_path,
flags == DICT_TF_COMPACT ? 0 : flags,
– FIL_IBD_FILE_INITIAL_SIZE);
+ table->datafile_initial_size < FIL_IBD_FILE_INITIAL_SIZE ?
+ FIL_IBD_FILE_INITIAL_SIZE : table->datafile_initial_size);
table->space = (unsigned int) space;
if (error != DB_SUCCESS) {
Index: storage/innobase/handler/ha_innodb.cc
===================================================================
— storage/innobase/handler/ha_innodb.cc (revision 3063)
+++ storage/innobase/handler/ha_innodb.cc (working copy)
@@ -7155,6 +7155,7 @@
col_len);
}
+ table->datafile_initial_size= form->datafile_initial_size;
error = row_create_table_for_mysql(table, trx);
if (error == DB_DUPLICATE_KEY) {
@@ -7760,6 +7761,7 @@
row_mysql_lock_data_dictionary(trx);
+ form->datafile_initial_size= create_info->datafile_initial_size;
error = create_table_def(trx, form, norm_name,
create_info->options & HA_LEX_CREATE_TMP_TABLE ? name2 : NULL,
flags);
Index: storage/innobase/include/dict0mem.h
===================================================================
— storage/innobase/include/dict0mem.h (revision 3063)
+++ storage/innobase/include/dict0mem.h (working copy)
@@ -678,6 +678,7 @@
资源评论
weixin_38669674
- 粉丝: 11
- 资源: 931
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功