mysql表类型_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語句或者myisamchk-r命令來改善性能,并且在出現故障時恢復相對困難。
壓縮表由myisampack工具創建,占據非常小的磁盤空間。因為每個記錄是被單獨壓縮的,所有只有非常小的訪問開支。
二. InnoDB(P136)
1. 自動增長列
InnoDB表的自動增長列可以手工插入,但是插入的值如果是空或者0,則實際插入的將是自動增長后的值。
可以通過ALTER TABLE table_name?ATUO_INCREMENT=n;語句強制設置自動增長列的初始值,默認從1開始,但是該強制的默認值是保留在內存中的,如果該值在使用之前數據庫重啟,那么這個強制的默認值就會丟失,就需要在數據庫啟動以后重新設置。
可以使用select LAST_INSERT_ID();查詢當前線程最后插入記錄使用的值。如果一次插入了多條記錄,那么返回的是第一條記錄使用的自動增長值。
對于InnoDB表,自動增長列必須是索引列。如果是組合索引,也必須是組合索引的第一列,但是對于MyISAM表,自動增長列可以是組合索引的其他列,這樣插入記錄后,自動增長列是按照組合索引的前面幾列進行排序后遞增的。
2. 外鍵約束
在創建索引時,可以指定在刪除、更新父表時,對子表進行相應操作,包括RESTRICT、CASCADE、SET NULL和NO ACTION。
RESTRICT和NO ACTION相同,是指限制在子表有關聯記錄的情況下父表不能更新;
CASCADE表示父表在更新或者刪除時,更新或者刪除子表對應的記錄;
SET NULL則表示父表在更新或者刪除的時候,子表的對應字段被SET NULL。
例如:子表外鍵指定可以是ON DELETE RESTRICT ON UPDATE CASCADE。
當某個表被其他表創建了外鍵參照,那么該表的對應索引或者主鍵禁止被刪除。
在導入多個表時,如果需要忽略表之前的導入順序,可以暫時關閉外鍵的檢查;同樣,在執行LOAD DATA和ALTER TABLE操作的時候,可以通過暫時關閉外鍵約束來加快處理的速度,關閉的命令是SET FOREIGN_KEY_CHECKS=0;,執行完成之后,通過執行SET FOREIGN_KEY_CHECKS=1;語句改回原狀態。
對于InnoDB類型的表,外鍵的信息通過使用show create table或者show table status命令都可以顯示。例如:
show table status like‘city’\G
3. 存儲方式(P139)
使用共享表空間:這種方式創建的表結構保存在.frm文件中,數據和索引保存在innodb_data_home_dir和innodb_data_file_path定義的表空間中,可以是多個文件。
使用多表空間存儲:這種方式創建的表結構仍然保存在.frm文件中,但是每個表的數據和索引單獨保存在.ibd中,如果是個分區表,則每個分區對應單獨的.ibd文件,文件名是“表名+分區表”,可以在創建分區的時候指定每個分區的數據文件的位置,以此來將表的IO均勻分布在多個磁盤上。
三. MEMORY(P140)
MEMORY存儲引擎使用存在于內存中的內容來創建表。每個MEMORY表只實際對應一個磁盤文件,格式是.frm。MEMORY類型的表訪問非常的塊,因為它的數據是放在內存中的,并且默認使用HASH索引,但是一旦服務器關閉,表中的數據丟失掉。
給MEMORY表創建索引的時候,可以指定使用HASH索引還是BTREE索引;
在啟動MySQL服務的時候使用-init-file選項,把insert into ...select或load data infile這樣的語句放入這個文件中,就可以在服務啟動時從持久穩固的數據裝載表。(???)
由于維持MEMORY表會耗費系統的內存,所以當不再需要MEMORY表的內容時,應當執行delete from或truncate table(more)或者整個的刪除表(使用drop table操作)。
每個MEMORY表中可以放置數據量的大小,收到max_heap_table_size系統變量的約束,這個系統變量的初始值為16MB,可以根據需要調整。定義MEMORY表時,MAX_ROWS子句定義最大行數。
MEMORY表主要用于那些內容變化不頻繁的代碼表,或者作為統計操作的中間結果表,便于高效的對中間結果進行分析并得到最終的統計結果。
四. MERGE(P142)
MERGE存儲引擎是一組MyISAM表的組合,這些MyISAM表必須結構完全相同,MERGE表本身并沒有數據,對MERGE類型的表可以進行查詢、更新、刪除操作,這些操作實際上是對內部的MyISAM表進行的。對于MERGE類型表的插入操作,是通過INSERT_METHOD子句定義插入的表,可以有3個不同的值,使用FIRST或LAST值使得插入操作被相應的作用第一或最后一個表上,不定義這個子句或者定義為NO,表示不能對這個MERGE表執行插入操作。
可以對MERGE表進行DROP操作,這個操作只是刪除MERGE的定義,對內部的表沒有任何的影響。
MERGE表在磁盤上保留兩個文件,文件名以表的名字開始,一個.frm文件存儲表定義,另一個.MRG文件包含組合表的信息,包括MERGE表由那些表組成、插入新的數據時的依據。可以通過修改.MRG文件來修改MERGE表,但是修改后要通過FLUSH TABLES刷新。
查看payment_all的表中的數據會發現是payment_2006和payment_2007表的記錄合并后的結果集。向payment_all插入的數據會被插入到payment_2007中。
MERGE表的優點在于可以突破單個MyISAM表的大小限制,并且通過將不同的表分布在多個磁盤上,可以有效的改善MERGE表的訪問效率。
總結
以上是生活随笔為你收集整理的mysql表类型_MySQL表类型的选择的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 巴马藤茶的功效与作用、禁忌和食用方法
- 下一篇: 莲藕粉的功效与作用、禁忌和食用方法
