InnoDB建表时设定初始大小 (Setting InnoDB table datafile ini
本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/database/setting_innodb_table_initial_size.html InnoDB在写密集的压力时,由于B-Tree扩展,因而也会带来数据文件的
本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/database/setting_innodb_table_initial_size.html
InnoDB在写密集的压力时,由于B-Tree扩展,因而也会带来数据文件的扩展,然而,InnoDB数据文件扩展需要使用mutex保护数据文件,这就会导致波动。 丁奇的博客说明了这个问题:http://dinglin.iteye.com/blog/1317874
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: http://dinglin.iteye.com/blog/1317874
解决的方法也很简单,只要知道数据文件可能会增长到多大,预先扩展即可。阅读代码可以知道,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 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 @@ /** Value of dict_table_struct::magic_n */ # define DICT_TABLE_MAGIC_N 76333786 #endif /* UNIV_DEBUG */ + uint datafile_initial_size; /* the initial size of the datafile */ }; ? #ifndef UNIV_NONINL Index: support-files/mysql.5.5.18.spec =================================================================== --- support-files/mysql.5.5.18.spec (revision 3063) +++ support-files/mysql.5.5.18.spec (working copy) @@ -244,7 +244,7 @@ Version: 5.5.18 Release: %{release}%{?distro_releasetag:.%{distro_releasetag}} Distribution: %{distro_description} -License: Copyright (c) 2000, 2011, %{mysql_vendor}. All rights reserved. Under %{license_type} license as shown in the Description field. +License: Copyright (c) 2000, 2012, %{mysql_vendor}. All rights reserved. Under %{license_type} license as shown in the Description field. Source: http://www.mysql.com/Downloads/MySQL-5.5/%{src_dir}.tar.gz URL: http://www.mysql.com/ Packager: MySQL Release Engineering Index: sql/table.h =================================================================== --- sql/table.h (revision 3063) +++ sql/table.h (working copy) @@ -596,6 +596,7 @@ */ key_map keys_in_use; key_map keys_for_keyread; + uint datafile_initial_size; /* the initial size of the datafile */ ha_rows min_rows, max_rows; /* create information */ ulong avg_row_length; /* create information */ ulong version, mysql_version; @@ -1094,6 +1095,8 @@ #endif MDL_ticket *mdl_ticket; ? + uint datafile_initial_size; + void init(THD *thd, TABLE_LIST *tl); bool fill_item_list(List *item_list) const; void reset_item_list(List *item_list) const; Index: sql/sql_yacc.yy =================================================================== --- sql/sql_yacc.yy (revision 3063) +++ sql/sql_yacc.yy (working copy) @@ -906,6 +906,7 @@ %token DATABASE %token DATABASES %token DATAFILE_SYM +%token DATAFILE_INITIAL_SIZE_SYM %token DATA_SYM /* SQL-2003-N */ %token DATETIME %token DATE_ADD_INTERVAL /* MYSQL-FUNC */ @@ -5046,6 +5047,18 @@ Lex->create_info.db_type= $3; Lex->create_info.used_fields|= HA_CREATE_USED_ENGINE; } + | DATAFILE_INITIAL_SIZE_SYM opt_equal ulonglong_num + { + if ($3 > UINT_MAX32) + { + Lex->create_info.datafile_initial_size= UINT_MAX32; + } + else + { + Lex->create_info.datafile_initial_size= $3; + } + Lex->create_info.used_fields|= HA_CREATE_USED_DATAFILE_INITIAL_SIZE; + } | MAX_ROWS opt_equal ulonglong_num { Lex->create_info.max_rows= $3; @@ -12585,6 +12598,7 @@ | CURSOR_NAME_SYM {} | DATA_SYM {} | DATAFILE_SYM {} + | DATAFILE_INITIAL_SIZE_SYM{} | DATETIME {} | DATE_SYM {} | DAY_SYM {} Index: sql/handler.h =================================================================== --- sql/handler.h (revision 3063) +++ sql/handler.h (working copy) @@ -387,6 +387,8 @@ #define HA_CREATE_USED_TRANSACTIONAL (1L <img src="/static/imghw/default1.png" data-src="http://www1.feedsky.com/t1/727603630/plinux/feedsky/s.gif?r=http://www.penglixun.com/tech/database/setting_innodb_table_initial_size.html" class="lazy" border="0" style="max-width:90%" style="position:absolute" style="max-width:90%" alt="InnoDB建表时设定初始大小 (Setting InnoDB table datafile ini" > 本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: ht […...<img src="/static/imghw/default1.png" data-src="http://www1.feedsky.com/t1/727603630/plinux/feedsky/s.gif?r=http://www.penglixun.com/tech/database/setting_innodb_table_initial_size.html" class="lazy" border="0" style="max-width:90%" style="position:absolute" style="max-width:90%" alt="InnoDB建表时设定初始大小 (Setting InnoDB table datafile ini" >

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)
![如何在VirtualBox中增加磁碟大小[指南]](https://img.php.cn/upload/article/000/887/227/171064142025068.jpg?x-oss-process=image/resize,m_fill,h_207,w_330)
我們經常遇到預定義磁碟大小沒有空間容納更多資料的情況?如果您在稍後階段需要更多的虛擬機器硬碟空間,則必須擴充虛擬硬碟和分割區。在這篇文章中,我們將看到如何在VirtualBox中增加磁碟大小。增加VirtualBox中的磁碟大小重要的是要注意,您可能希望在執行這些操作之前備份您的虛擬硬碟文件,因為總是有可能出錯。有備份總是一個好的做法。然而,該過程通常運作良好,請確保在繼續之前關閉您的機器。有兩種方法可以增加VirtualBox中的磁碟大小。使用圖形使用者介面擴充VirtualBox的磁碟大小使用CL

InnoDB是MySQL的資料庫引擎之一,現在是MySQL的預設儲存引擎,為MySQL AB發布binary的標準之一;InnoDB採用雙軌制授權,一個是GPL授權,另一個是專有軟體授權。 InnoDB是事務型資料庫的首選引擎,支援事務安全表(ACID);InnoDB支援行級鎖,行級鎖可以最大程度的支援並發,行級鎖是由儲存引擎層實現的。

PiNetwork節點詳解及安裝指南本文將詳細介紹PiNetwork生態系統中的關鍵角色——Pi節點,並提供安裝和配置的完整步驟。 Pi節點在PiNetwork區塊鏈測試網推出後,成為眾多先鋒積極參與測試的重要環節,為即將到來的主網發布做準備。如果您還不了解PiNetwork,請參考Pi幣是什麼?上市價格多少? Pi用途、挖礦及安全性分析。什麼是PiNetwork? PiNetwork項目始於2019年,擁有其專屬加密貨幣Pi幣。該項目旨在創建一個人人可參與

InnoDB是將表中的資料儲存到磁碟上的儲存引擎,所以即使關機後重新啟動我們的資料還是存在的。而真正處理資料的過程是發生在記憶體中的,所以需要把磁碟中的資料載入到記憶體中,如果是處理寫入或修改請求的話,還需要把記憶體中的內容刷新到磁碟上。而我們知道讀寫磁碟的速度非常慢,和記憶體讀寫差了幾個數量級,所以當我們想從表中獲取某些記錄時,InnoDB儲存引擎需要一條一條的把記錄從磁碟上讀出來麼? InnoDB採取的方式是:將資料分割成若干個頁,以頁作為磁碟和記憶體之間互動的基本單位,InnoDB中頁的大小一般為16

一、回退重新裝mysql為避免再從其他地方導入這個資料的麻煩,先對目前庫的資料庫檔案做了個備份(/var/lib/mysql/位置)。接下來將Perconaserver5.7包進行了卸載,重新安裝原先老的5.1.71的包,啟動mysql服務,提示Unknown/unsupportedtabletype:innodb,無法正常啟動。 11050912:04:27InnoDB:Initializingbufferpool,size=384.0M11050912:04:27InnoDB:Complete

MySQL儲存引擎選用比較:InnoDB、MyISAM與Memory效能指標評估引言:在MySQL資料庫中,儲存引擎的選擇對於系統效能和資料完整性起著至關重要的作用。 MySQL提供了多種儲存引擎,其中最常用的引擎包括InnoDB、MyISAM和Memory。本文將就這三種儲存引擎進行效能指標評估,並透過程式碼範例進行比較。一、InnoDB引擎InnoDB是My

1.Mysql的事務隔離級別這四種隔離級別,當存在多個事務並發衝突的時候,可能會出現髒讀,不可重複讀,幻讀的一些問題,而innoDB在可重複讀隔離級別模式下解決了幻讀的一個問題,2.什麼是幻讀幻讀是指在同一個事務中,前後兩次查詢相同範圍的時候得到的結果不一致如圖,第一個事務裡面,我們執行一個範圍查詢,這時候滿足條件的資料只有一條,而在第二個事務裡面,它插入一行資料並且進行了提交,接著第一個事務再去查詢的時候,得到的結果比第一次查詢的結果多出來一條數據,注意第一個事務的第一次和第二次查詢,都在同

InnoDB的全文搜索功能非常强大,能够显著提高数据库查询效率和处理大量文本数据的能力。1)InnoDB通过倒排索引实现全文搜索,支持基本和高级搜索查询。2)使用MATCH和AGAINST关键字进行搜索,支持布尔模式和短语搜索。3)优化方法包括使用分词技术、定期重建索引和调整缓存大小,以提升性能和准确性。
