MySQL表類型的選擇
P131)創建表時的默認引擎是InnoDB,如果要修改默認的存儲引擎,可以在參數文件中設置default-table-type。查看當前的默認存儲引擎,可以使用一下命令:
創建新表的時候可以通過增加ENGINE關鍵字設置新建表的存儲引擎。也可以通過ALTER TABLE語句,將一個已經存在的表修改成其他的存儲引擎。
一. MyISAM(P134)
MyISAM不支持事務,不支持外鍵,其優勢是訪問速度塊,對事務完整性沒有要求或者以SELECT、INSERT為主的應用基本上都可以使用這個引擎來創建表。
每個MyISAM在磁盤上存儲為3個文件,其文件名都和表名相同,但拓展名分別為:
- .frm(存儲表定義);
- .MYD(MYData,存儲數據);
- .MYI(MYIndex,存儲索引)。
數據文件和索引文件可以放在不同的目錄,平均分布IO,獲得更快的速度。
MyISAM表還支持3種不同的存儲格式,分別是:
- 靜態(固定長度)表;
- 動態表;
- 壓縮表。
靜態表是默認的存儲格式,其中的字段都是非變長字段,這樣每個記錄的長度都是固定的,優點是存儲速度非常迅速,容易緩存,出現故障容易恢復;缺點是占用的空間通常比動態表多。靜態表的數據在存儲時會按照列的寬度定義補足空格,然後在獲取的時候將最後的空格全部去掉。
動態表中包含變長字段,記錄不是固定長度的,這樣存儲的優點是占用的空間少,但頻繁的更新和刪除記錄會產生碎片,需要定期執行OPTIMIZE TABLE
壓縮表由myisampack工具創建,占據非常小的磁盤空間。因為每個記錄是被單獨壓縮的,所有只有非常小的訪問開支。
二. InnoDB(P136)
InnoDB表的自動增長列可以手工插入,但是插入的值如果是空或者0,則實際插入的將是自動增長後的值。
可以通過ALTER TABLE table_name ATUO_INCREMENT=n;語句強制設置自動增長列的初始值,默認從1開始,但是該強制的默認值是保留在內存中的,如果該值在使用之前數據庫重啟,那麽這個強制的默認值就會丟失,就需要在數據庫啟動以後重新設置。
可以使用select LAST_INSERT_ID();
對於InnoDB表,自動增長列必須是索引列。如果是組合索引,也必須是組合索引的第一列,但是對於MyISAM表,自動增長列可以是組合索引的其他列,這樣插入記錄後,自動增長列是按照組合索引的前面幾列進行排序後遞增的。
MySQL表類型的選擇