MySQL默認(rèn)引擎Innodb
Innodb使用表空間進(jìn)行數(shù)據(jù)存儲(chǔ)
控制參數(shù):innidb_file_per_table
? ? ON:獨(dú)立表空間:tablename.ibd
? ? OFF:系統(tǒng)表空間:ibdtaX(X代表數(shù)字)
????show variables like 'innodb_file_per_table';

//默認(rèn)innodb_file_per_table 是on
mysql服務(wù)器數(shù)據(jù)存儲(chǔ)文件目錄:/usr/local/mysql/var
innodb的存儲(chǔ)文件

.frm文件 記錄表結(jié)構(gòu),.ibd存儲(chǔ)innodb數(shù)據(jù)。
//將innodb_file_per_table設(shè)置為off #set global?innodb_file_per_table=off;
則只有該表的.frm文件,沒有 .ibd文件。
系統(tǒng)表空間和獨(dú)立表空間如何選擇:
收縮性
? ? 系統(tǒng)表空間無法簡(jiǎn)單的收縮文件大小
? ? ? ? 當(dāng)innodb_file_per_table值為off,innodb的表會(huì)存在系統(tǒng)表空間當(dāng)中。在繁忙的業(yè)務(wù)當(dāng)中,系統(tǒng)表空間會(huì)不斷的增長,只要不超過我們磁盤的限制都可以,但一旦磁盤空間不足,我們不得不刪除系統(tǒng)當(dāng)中無效的數(shù)據(jù),比如不會(huì)被長期使用的日志類數(shù)據(jù),我們刪除數(shù)據(jù)后系統(tǒng)表空間并不會(huì)縮小,另外我們想通過復(fù)制文件的方式給數(shù)據(jù)備份,雖然刪除了文件數(shù)據(jù),但表空間的大小并不會(huì)改變。解決辦法,把所有innodb中的表導(dǎo)出后,刪除innodb相關(guān)的表文件后,在重啟mysql,在導(dǎo)入數(shù)據(jù)。使用系統(tǒng)表空間,無法很容易的收縮系統(tǒng)文件,造成大量的磁盤碎片,降低系統(tǒng)性能。
? ? 獨(dú)立表空間可以通過optimize table 命令收縮系統(tǒng)文件
????????當(dāng)對(duì)某一個(gè)大表清理時(shí),可只對(duì)這個(gè)表進(jìn)行optimize table重建,不需要重啟數(shù)據(jù)庫,同時(shí)也不會(huì)影響這個(gè)表的訪問。
IO
系統(tǒng)表空間會(huì)產(chǎn)生IO瓶頸
? ? 由于只有一個(gè)文件,那么對(duì)多個(gè)表進(jìn)行同時(shí)數(shù)據(jù)刷新時(shí),在文件系統(tǒng)實(shí)現(xiàn)時(shí)是順序進(jìn)行的。會(huì)產(chǎn)生一定的IO瓶頸。
獨(dú)立表空間可以同時(shí)向多個(gè)文件刷新數(shù)據(jù)
? ? 對(duì)于獨(dú)立表空間,每一個(gè)表都有自己的獨(dú)立文件,則數(shù)據(jù)刷新時(shí),可以多個(gè)文件寫入。
表轉(zhuǎn)移步驟
把系統(tǒng)表空間的表轉(zhuǎn)移到獨(dú)立表空間
1、使用mysqldump導(dǎo)出所有數(shù)據(jù),
2、停止mysql服務(wù)器,修改參數(shù),并刪除Innodb相關(guān)文件
3、重啟MySQL服務(wù),重建Innodb系統(tǒng)表空間
4、重新導(dǎo)入數(shù)據(jù)
Innodb 存儲(chǔ)引擎的特性?
? ? 1、事務(wù)性存儲(chǔ)引擎
? ????????? 完全支持事務(wù)的ACID特性(原子性、一致性、隔離性、持久性)
? ? ? ? ? ? Redo Log(重做日志) 和 Undo Log(回滾日志)
????????????Redo Log實(shí)現(xiàn)持久性,有兩部分一個(gè)是內(nèi)存中的重做日志緩沖區(qū) ? ? ,由innodb_log_buffer_size 決定大小,另一個(gè)是重做日志文件innodb_log_files_in_group文件。


? ? 2、行級(jí)鎖
????????????作用管理共享資源的并發(fā)訪問
????????????鎖實(shí)現(xiàn)事務(wù)的隔離性 ? ?
? ? ? ? ? ? 鎖的類型(共享鎖(讀鎖)、獨(dú)占鎖(寫鎖))
????????????鎖的粒度(表級(jí)鎖、行級(jí)鎖)
? ? ? ? ? ? 表級(jí)鎖語句: lock table 表名 write;解鎖語句:unlock table;
? ? ? ? ????阻塞和死鎖
? ? ? ? ? ? ? ? ? ? 阻塞:不同鎖之間兼容性間的關(guān)系,在一些事務(wù)中的鎖需要等待了一個(gè)事務(wù)中的鎖釋放資源,形成阻塞。
? ? ? ? ? ? ? ? ? ? 死鎖:兩個(gè)或兩個(gè)以上的事務(wù)在執(zhí)行過程中相互占用了對(duì)方等待的資源而產(chǎn)生的異常??梢杂上到y(tǒng)自動(dòng)處理,系統(tǒng)選擇資源占有最小的事務(wù)回滾,其他事務(wù)可繼續(xù)。
3、Innodb狀態(tài)檢查
? ? show engine innodb status
使用場(chǎng)景:
v5.6前 除空間應(yīng)用和全文索引應(yīng)用都可以Innodb,該兩者只有MyIsam支持。
v5.7以后Innodb可支持空間應(yīng)用和全文索引應(yīng)用