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;
以上就是关于对mysql InnoDB建表时设定初始大小的方法的详细介绍。欢迎大家对mysql InnoDB建表时设定初始大小的方法内容提出宝贵意见

mysql InnoDB建表时设定初始大小的方法的更多相关文章

  1. mysql workbench 建表时 PK,NN,UQ,BIN,UN,ZF,AI解释

    mysql workbench 建表时 - PK: primary key (column is part of a pk) 主键 - NN: not null (column is nullable ...

  2. MySQL创建数据表时设定引擎MyISAM/InnoDB

    我在配置mysql时将配置文件中的默认存储引擎设定为了InnoDB.今天查看了MyISAM与InnoDB的区别,在该文中的第七条"MyISAM支持GIS数据,InnoDB不支持.即MyISA ...

  3. MySQL Workbench建表时 PK NN UQ BIN UN ZF AI 的含义

    [转自网络]https://my.oschina.net/cers/blog/292191 PK Belongs to primary key 作为主键 NN Not Null 非空 UQ Uniqu ...

  4. mysql workbench建表时PK,NN,UQ,BIN,UN,ZF,AI

    1. [intrinsic column flags] (基本字段类型标识) - PK: primary key (column is part of a pk) 主键 - NN: not null ...

  5. MySQL建表时列名同保留字重复问题解决办法

    建表时遇到遇到属性名同MySQL的保留字相同导致不能建表的问题,如下SQL语句: CREATE TABLE TBL_ACCOUNT_FROZEN_RECORD ( ID BIGINT NOT NULL ...

  6. SAP:建表时如果有QUAN、CURR类型的字段不能激活的问题

    建表时如有一个QUAN类型的字段,那么就要给字段设置Reference field,参考的字段的Data Type要是UNIT, 并设置对应的Reference table,也就是参考字段所在的tab ...

  7. MVC EF 移除建表时自动加上s的复数形式

    移除建表时自动加上s的复数形式 public class DBContext : DbContext { public DBContext() : base("name=DBContext& ...

  8. oracle 建表时显示ORA-00984: 列在此处不允许

      oracle 建表时显示ORA-00984: 列在此处不允许 CreationTime--2018年7月19日16点10分 Author:Marydon 1.情景展示 使用plsql建表时,报错 ...

  9. oracle 建表时显示ORA-00904无效的标识符

      oracle 建表时显示ORA-00904无效的标识符 CreationTime--2018年7月19日16点03分 Author:Marydon 1.情景展示 使用plsql建表时,报错 字段展 ...

  10. mysql sql语句执行时是否使用索引检查方法

    在日常开发中,使用到的数据表经常都会有索引,这些索引可能是开发人员/DBA建表时创建的,也可能是在使用过程中新增的.合理的使用索引,可以加快数据库查询速度.然而,在实际开发工作中,会出现有些sql语句 ...

随机推荐

  1. 在idea里面如何配置自己的tomcat

    第一:到官网上去下载自己电脑对应的tomcat版本 第二:下载后解压 在bin目录里面找到: 双击打开是不是会出现: 然后再在bin里面找到:shutdown.bat 双击给他关闭了 第三:在我的电脑 ...

  2. MCP赋能,给Cursor插上“外挂翅膀”:实战操作数据库

    先给大家个例子, 展示如何用mcp如何带飞cursor的.  话不多说,  继续展示 1.建立项目 提示词如下: " 新建个java项目, 叫user-demo,  通过spring boo ...

  3. 详解HarmonyOS NEXT系统中ArkTS和仓颉的混合开发

    连续分享了很多天鸿蒙仓颉语言的开发教程,大家现在应该都知道鸿蒙开发有ArkTs和仓颉两种开发语言,这两种语言有些相似,而且还支持混合开发,今天就分享一下怎么实现ArkTs和仓颉的混合开发,分不清这两种 ...

  4. PI发布rest,json接口

    PI接口的开发分成两个部分,第一个部分是ESB(Enterprise Services Builder)部分,这里注意做数据结构定义,接口导入,字段关系映射,定义接口等. 第二部分是IB(Integr ...

  5. 一文读懂:开源大数据调度系统Taier1.2版本新增的「工作流」到底是什么?

    一.什么是工作流? 在阐述什么是工作流之前,先说一下工作流和普通任务的区别,在于依赖视图. 普通任务本身他只会有自己的dag图,依赖视图是无边界的,不可控的,而工作流则是把整个工作流都展示出来,是有边 ...

  6. 什么是网格变形?HyperWorks网格变形设置方法

    HyperMorph 是 HyperMesh 向用户提供的强大的网格变形工具.它可以在保证基本网格形态和质量的前提下,按照用户使用需求,自如的对已有的有限元模型进行网格变形. HyperMorph 可 ...

  7. 你的终端AI副驾

    Google 重磅推出了 Gemini CLI,这是一款基于 Gemini 大模型驱动的命令行工具. 它把强大的生成式 AI 能力无缝整合进终端,能通过自然语言对话帮你写代码.梳理项目.自动化任务等, ...

  8. C# WinForm 控件设置双缓存

    DataGridView.GetType().GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instan ...

  9. vue打包后文件自定定义命名规则

    js文件和svg以及图片 module.exports = { chainWebpack: config = >{ const svgRule = config.module.rule('svg ...

  10. Luogu P3549 [POI 2013] MUL-Multidrink 题解

    P3549 [POI 2013] MUL-Multidrink 非常 tricky 的一道题,模拟赛拼尽全力无法战胜,写篇题解记录一下. 容易理解的直接构造法. 按原题限制随便跳会破坏很多性质,几乎无 ...