mysql外键_mysql系列之存储引擎
本篇主要介紹mysql的存儲引擎,說明主要的幾個存儲引擎的特性及其差別。
一、存儲引擎介紹
在這里插入圖片描述數據庫存儲引擎是數據庫底層軟件組件,數據庫管理系統使用數據引擎進行創建、查詢、更新和刪除數據操作。不同的存儲引擎提供不同的存儲機制、索引技巧、鎖定水平等功能,使用不同的存儲引擎還可以獲得特定的功能。
MySQL 的核心就是存儲引擎,不同存儲引擎支持的特性各不相同。
MySQL中的存儲引擎是插件式存儲引擎。
MySQL 5.5.5 之后,InnoDB 作為默認存儲引擎。
MySQL中的存儲引擎的控制級別是表級別,我們可以在建表的時候指定表采用的存儲引擎。
二、MySQL支持的存儲引擎類型
MySQL 5.7 支持的存儲引擎有 InnoDB、MyISAM、Memory、Merge、Archive、Federated、CSV、BLACKHOLE 等。
可以使用SHOW ENGINES語句查看系統所支持的引擎類型,結果如圖所示。
Support 列的值表示某種引擎是否能使用,YES表示可以使用,NO表示不能使用,DEFAULT表示該引擎為當前默認的存儲引擎。
官網對各個存儲引擎特性的說明:
| 事務支持 | No | No | Yes | Yes |
| 鎖的粒度 | Table | Table | Row | Row |
| 存儲限制 | 256TB | RAM | 64TB | 384EB |
| MVCC | No | No | Yes | No |
| 外鍵支持 | No | No | Yes | Yes |
| 聚簇索引 | No | No | Yes | No |
| B-tree索引 | Yes | Yes | Yes | No |
| 全文檢索 | Yes | No | Yes? | No |
| 地理空間數據類型支持 | Yes | No | Yes | Yes |
| 地理空間索引支持 | Yes | No | Yes? | No |
| Hash索引 | No | Yes | No | Yes |
| T-tree索引 | No | No | No | Yes |
| 索引緩存 | Yes | N/A | Yes | Yes |
| 集群支持 | No | No | No | Yes |
| 壓縮數據 | Yes | No | Yes | No |
| 數據緩存 | No | N/A | Yes | Yes |
| 數據加密 | Yes? | Yes? | Yes | Yes |
| 備份和時間點恢復 | Yes | Yes | Yes | Yes |
| 主從支持 | Yes | Limited | Yes | Yes |
三、重點引擎的類型介紹
1、InnoDB存儲引擎
從MySQL5.5版本之后,MySQL的默認內置存儲引擎已經是InnoDB了,他的主要特點有:
(1)災難恢復性比較好;
(2)支持事務。默認的事務隔離級別為可重復度,通過MVCC(并發版本控制)來實現的。
(3)使用的鎖粒度為行級鎖,可以支持更高的并發;
(4)支持外鍵;
(5)配合一些熱備工具可以支持在線熱備份;
(6)在InnoDB中存在著緩沖管理,通過緩沖池,將索引和數據全部緩存起來,加快查詢的速度;
(7)支持聚簇索引。對于InnoDB類型的表,其數據的物理組織形式是聚簇表。所有的數據按照主鍵來組織。數據和索引放在一塊,都位于B+數的葉子節點上,通過聚簇索引來查詢可以減少回表查詢。
(8)InnoDB不保存表的具體行數,執行select count(*) from table時需要全表掃描
(9)支持B-tree索引和全文檢索( MySQL 5.6后InnoDB存儲引擎開始支持全文檢索)
(10)不支持Hash索引,但是內置了自適應hash索引。
2、MyISAM存儲引擎
在5.5版本之前,MyISAM是MySQL的默認存儲引擎,該存儲引擎并發性差,不支持事務,所以使用場景比較少,主要特點為:
(1)不支持事務;
(2)不支持外鍵,如果強行增加外鍵,不會提示錯誤,只是外鍵不起作用;
(3)不支持聚簇索引,對數據的查詢緩存只會緩存索引,不會像InnoDB一樣緩存數據,而且是利用操作系統本身的緩存;
(4)默認的鎖粒度為表級鎖,所以并發度很差,加鎖快,鎖沖突較少,所以不太容易發生死鎖;
(5)支持全文索引(MySQL5.6之后,InnoDB存儲引擎也對全文索引做了支持),但是MySQL的全文索引基本不會使用,對于全文索引,現在有其他成熟的解決方案,比如:ElasticSearch,Solr,Sphinx等。
(6)數據庫所在主機如果宕機,MyISAM的數據文件容易損壞,而且難恢復;
重點:InnoDB和MyISAM的對比
1、事務支持:InnoDB支持事務,MyISAM不支持事務。
2、鎖粒度:InnoDB為行級鎖,MyISAM為表級鎖。所以InnoDB比MyISAM支持更高的并發;
3、外鍵支持:InnoDB支持外鍵,MyISAM不支持外鍵。
4、聚簇索引支持:InnoDB支持聚簇索引,MyISAM不支持聚簇。
5、數據安全和備份:在備份容災上,InnoDB支持在線熱備,有很成熟的在線熱備解決方案;
6、查詢性能:MyISAM的查詢效率高于InnoDB,因為InnoDB在查詢過程中,是需要維護數據緩存,而且查詢過程是先定位到行所在的數據塊,然后在從數據塊中定位到要查找的行;而MyISAM可以直接定位到數據所在的內存地址,可以直接找到數據;
7、表的總記錄數統計:SELECT COUNT(*)語句,如果行數在千萬級別以上,MyISAM可以快速查出,而InnoDB查詢的特別慢,因為MyISAM將行數單獨存儲了,而InnoDB需要逐行去統計行數;所以如果使用InnoDB,而且需要查詢行數,則需要對行數進行特殊處理,如:離線查詢并緩存;
8、存儲文件:MyISAM的表結構文件包括:.frm(表結構定義),.MYI(索引),.MYD(數據);而InnoDB的表數據文件為:.ibd和.frm(表結構定義);
3、MEMORY存儲引擎
將數據存在內存中,和市場上的Redis,memcached等思想類似,為了提高數據的訪問速度,主要特點:
(1)支持的數據類型有限制,比如:不支持TEXT和BLOB類型,對于字符串類型的數據,只支持固定長度的行,VARCHAR會被自動存儲為CHAR類型;
(2)支持的鎖粒度為表級鎖。所以,在訪問量比較大時,表級鎖會成為MEMORY存儲引擎的瓶頸;
(3)由于數據是存放在內存中,所以在服務器重啟之后,所有數據都會丟失;
(4)查詢的時候,如果有用到臨時表,而且臨時表中有BLOB,TEXT類型的字段,那么這個臨時表就會轉化為MyISAM類型的表,性能會急劇降低;
四、如何選擇合適的存儲引擎
1、使用場景是否需要事務支持;
2、是否需要支持高并發,InnoDB的并發度遠高于MyISAM;
3、是否需要支持外鍵;
4、是否需要支持在線熱備;
5、高效緩沖數據,InnoDB對數據和索引都做了緩沖,而MyISAM只緩沖了索引;
6、索引,不同存儲引擎的索引并不太一樣;
7、是否需要支持集群。
總的來說,目前主流的MySQL使用場景都需要支持事務,所以采用InnoDB存儲引擎,這也是為什么MySQL官方在MySQL 5.5.5 之后將InnoDB 作為默認存儲引擎的原因。
五、存儲引擎設置
1、建表的時候指定存儲引擎
CREATE?TABLE?t1?(i?INT)?ENGINE?=?INNODB;2、設置默認的存儲引擎
MySQL 5.5.5 之后InnoDB是默認存儲引擎,如果需要修改默認的存儲引擎,可以通過修改my.cnf配置文件中的default-storage-engine的值。
default_storage_engine=NDBCLUSTER;3、修改表的存儲引擎
ALTER?TABLE?t?ENGINE?=?InnoDB;總結
本文主要介紹了mysql的存儲引擎以及各存儲引擎的特性。
核心是:InnoDB和MyISAM的區別,面試中的高頻問題。
注意MySQL的存儲引擎控制的粒度是表級別的,也就是同一個數據庫中的不同表可以設置不同的存儲引擎。
更多精彩,關注我吧。
圖注:跟著老萬學java總結
以上是生活随笔為你收集整理的mysql外键_mysql系列之存储引擎的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大师厉以宁:一生质朴,勤耕不辍,最关注保
- 下一篇: 微软将ChatGPT相关AI技术集成到更