前言:學習mysql的時候總是習慣性的和oracle資料庫進行比較。在學習mysql innodb的儲存結構的時候也免不了跟oracle進行比較。oracle的資料儲存有表空間、段、區、塊、資料檔案;mysql innodb的儲存管理也類似,但是mysql增加了乙個共享表空間和獨立表空間的概念;
一、概念
共享表空間: innodb的所有資料儲存在乙個單獨的表空間裡面,而這個表空間可以由很多個檔案組成,乙個表可以跨多個檔案存在,所以其大小限制不再是檔案大小的限制,而是其自身的限制。從innodb的官方文件中可以看到,其表空間的最大限制為64tb,也就是說,innodb的單錶限制基本上也在64tb左右了,當然這個大小是包括這個表的所有索引等其他相關資料。
獨立表空間:
二、檢視資料庫的表空間
mysql> show variables like 'innodb_data%';
l 表空間有四個檔案組成:ibdata1、ibdata2、ibdata3、ibdata4,每個檔案的大小為10m,當每個檔案都滿了的時候,ibdata4會自動擴充套件;
l 當前的儲存空間滿的時候,可以在其他的磁碟新增資料檔案,語法如下:語法如下所示:
pathtodatafile:sizespecification;pathtodatafile:sizespec;.;pathtodatafile:sizespec[:autoextend[:max:sizespecification]]
如果用 autoextend 選項描述最後乙個資料檔案,當 innodb 用盡所有表自由空間後將會自動擴充最後乙個資料檔案,每次增量為 8 mb。示例:
不管是共享表空間和獨立表空間,都會存在innodb_data_file檔案,因為這些檔案不僅僅要存放資料,而且還要充當著類似於oracle的undo表空間等一些角色。
三、共享表空間優缺點
既然innodb有共享表空間和獨立表空間兩種型別,那麼這兩種表空間存在肯定都有時候自己的應用的場景,存在即合理。以下是摘自mysql官方的一些介紹:
3.1 共享表空間的優點
表空間可以分成多個檔案存放到各個磁碟,所以表也就可以分成多個檔案存放在磁碟上,表的大小不受磁碟大小的限制(很多文件描述有點問題)。
資料和檔案放在一起方便管理。
3.2 共享表空間的缺點
所有的資料和索引存放到乙個檔案,雖然可以把乙個大檔案分成多個小檔案,但是多個表及索引在表空間中混合儲存,當資料量非常大的時候,表做了大量刪除操作後表空間中將會有大量的空隙,特別是對於統計分析,對於經常刪除操作的這類應用最不適合用共享表空間。
共享表空間分配後不能回縮:當出現臨時建索引或是建立乙個臨時表的操作表空間擴大後,就是刪除相關的表也沒辦法回縮那部分空間了(可以理解為oracle的表空間10g,但是才使用10m,但是作業系統顯示mysql的表空間為10g),進行資料庫的冷備很慢;
四、獨立表空間的優缺點
4.1 獨立表空間的優點
每個表都有自已獨立的表空間,每個表的資料和索引都會存在自已的表空間中,可以實現單錶在不同的資料庫中移動。
空間可以**(除drop table操作處,表空不能自已**)
drop table操作自動**表空間,如果對於統計分析或是日值表,刪除大量資料後可以通過:alter table tablename engine=innodb;回縮不用的空間。
對於使innodb-plugin的innodb使用turncate table也會使空間收縮。
對於使用獨立表空間的表,不管怎麼刪除,表空間的碎片不會太嚴重的影響效能,而且還有機會處理。
4.2 獨立表空間的缺點
單錶增加過大,當單錶占用空間過大時,儲存空間不足,只能從作業系統層面思考解決方法;
五、共享表空間和獨立表空間之間的轉換
5.1 檢視當前資料庫的表空間管理型別
指令碼:show variables like "innodb_file_per_table";
mysql> show variables like "innodb_file_per_table";
on代表獨立表空間管理,off代表共享表空間管理;(檢視單錶的表空間管理方式,需要檢視每個表是否有單獨的資料檔案)
5.2 修改資料庫的表空間管理方式
修改innodb_file_per_table的引數值即可,但是修改不能影響之前已經使用過的共享表空間和獨立表空間;
innodb_file_per_table=1 為使用獨佔表空間
innodb_file_per_table=0 為使用共享表空間
5.3共享表空間轉化為獨立表空間的方法(引數innodb_file_per_table=1需要設定)
單個表的轉換操作,指令碼:alter tabletable_nameengine=innodb;
當有大量的表需要操作的時候,先把資料庫匯出,然後刪除資料再進行匯入操作,該操作可以用mysqldump進行操作(
總結:經過以上操作便完成資料庫的儲存空間的轉換,了解技術是為了更好的利用技術,當資料量很小的時候建議使用共享表空間的管理方式。資料量很大的時候建議使用獨立表空間的管理方式。
MySQL InnoDB 唯一索引多個空值
注意,本篇內容針對mysql,並且使用innodb儲存引擎,其他儲存引擎對於唯一索引空值的行為不在討論範圍內。沒注意過這個問題 唯一索引可以允許多個空值,並且你查詢空值時還能用上索引?下面分析下它咋存的 我檢視了下這個索引頁的資料 把infimum和supremum之間的資料格式化一下,就是索引頁的...
mysql innodb單錶分割槽實戰
目的 為了了解mysql單錶分割槽方法,特此作為學習筆記記錄一下。一。準備表,建立乙個學生表,包含主鍵sid和名稱sname欄位 create table students sid int 5 primary key,sname varchar 24 二。準備資料 insert into stude...
MYSQL INNODB 鎖錶小研究
表結構如下 delimiter create table wrox shop order o id int 11 not null auto increment,order date datetime default null,order status varchar 45 default crea...