mysql存储引擎简介
什么是存儲引擎
?? mysql存儲引擎是數據庫如何存儲數據、怎樣建立索引以及如何查詢更新數據等技術的實現方法,數據通過使用不同的技術存儲在文件中,使用不同的存儲機制、索引方式來提供不同的功能。在mysql這種關系型數據中心來說,數據是以表的方式來存儲的,因此,簡單點來說,存儲引擎就是存儲和操作此表的類型。
mysql中有多種存儲引擎,使用命令:show engines 可以查看當前版本支持的存儲引擎。
???從結果來看,我們可以看到只有InnoDB是支持事務的,并且是mysql 的默認存儲引擎。下面分別介紹幾種常見的存儲引擎。
存儲引擎的種類
InnoDB
InnoDB是MySQL5.5版本及以上的默認存儲引擎,也是最重要,使用最廣泛的存儲引擎,它主要有以下幾種特點:
-
是mysql存貯引擎中唯一支持事務的,采用MVCC支持高并發,并且實現了四個標準的隔離級別,默認級別為REPEATABLE READ(可重復讀)。
-
表基于聚簇索引建立
-
支持外鍵
-
支持行鎖,不過要基于索引,如果是全表掃描的話,仍然是表鎖
InnoDB文件結構:
.frm與表相關的元數據信息都存放在frm文件,包括表結構的定義信息等;
.ibd文件和.ibdata文件;
???獨享表空間存儲方式使用.ibd文件,并且每個表一個ibd文件;共享表空間存儲方式使用.ibdata文件,所有表共同使用一個ibdata文件;
?? InnoDB使用B+Tree的方式存儲索引,Innodb的一個表可能包含多個索引,每個索引都使用B+樹來存儲。而索引包括聚集索引和非聚集索引(二級索引),聚集索引使用表的主鍵作為索引鍵,包含表的所有字段。非聚集索引只包含索引鍵和聚集索引鍵(主鍵)的內容,不包括其他字段。每一個索引都是一棵B+樹,每棵B+樹由很多頁面組成,而每個頁面大小一般為16K。
我們通過下圖看下表聚集索引和非聚集索引的差別:
聚集索引將索引和數據行保存在同一個B-Tree中,查詢通過聚集索引可以直接獲取數據
????????????????????????????????????????????????
???非聚集索引的葉子節點中保存的不是指向行的物理指針,而是行的主鍵值。當通過聚集索引查找行,存儲引擎需要在聚集索引中找到相應的葉子節點,獲得行的主鍵值,然后使用主鍵去聚簇索引中查找數據行,這需要兩次B-Tree查找。
????????????????????????????????????????????????
MyISAM
MyISAM提供了大量的特性,包括全文索引、壓縮、空間函數等,主要有以下特點:
-
不支持事務,不支持行鎖,支持表鎖,讀取時會對需要讀取到的所有表加共享鎖,寫入時則對表加排他鎖。
-
奔潰后無法安全修復,可以手工或者自動檢查和修復,但是可能導致一些數據的丟失,并且修復工作非常慢。
-
MyISAM會將表存儲在兩個文件中,數據文件和索引文件,分別以?.MYD和?.MYI為擴展名
-
支持全文索引,即使是BOLB或者TEXT等長字段,也可以基于前500個字符創建索引。
每個MyISAM在磁盤上存儲成三個文件:
.frm文件:與表相關的元數據信息都存放在frm文件,包括表結構的定義信息等。
.myd文件:用于存儲myisam表的數據
.myi文件:,用于存儲myisam表的索引相關信息
???MyISAM索引文件.MYI (MYIndex)和數據文件.MYD (MYData)是分離的,索引文件僅保存記錄所在頁的指針(物理位置),通過這些地址來讀取頁,進而讀取被索引的行。
主鍵索引跟非主鍵索引的結構是一樣:
????????????????????????????????????????????????
???樹中葉子保存的是對應行的物理位置。通過該值,存儲引擎能順利地進行回表查詢,得到一行完整記錄。同時,每個葉子頁也保存了指向下一個葉子頁的指針。從而方便葉子節點的范圍遍歷。
-
MyISAM引擎適用的生產業務場景:
-
不需要事務支持的業務
-
一般為讀數據比較多的應用,讀寫都頻繁場景不適合
-
讀寫并發訪問都相對較低的業務
-
對數據一致性要求不是很高的業務。
-
中小型的網站部分業務會用。
CSV引擎
?? CSV存儲引擎可以將csv文件作為mysql的表進行處理。存儲格式就是普通的csv文件,數據以文本方式存儲在文件中,所有的列必須都是不能為NULL的,不支持索引,可以直接對文件進行編輯。
在mysql中新建一張表,以CSV為存儲引擎,插入一條數據:
使用命令查看文件存儲位置:
mysql> show global variables like "%datadir%"; +---------------+-----------------+ | Variable_name | Value | +---------------+-----------------+ | datadir | /var/lib/mysql/ | +---------------+-----------------+ 1 row in set (0.01 sec)打開存儲文件,查看csv文件
[root@localhost shoes]# cat csvtest.CSV 1,"mike"csv文件可以直接修改,我們向表中插入幾條記錄
[root@localhost shoes]# vi csvtest.CSV 1,"mike" 2,"jack" 3,"Daniel"刷新表,然后查看數據
mysql> flush tables; Query OK, 0 rows affected (0.51 sec)mysql> select * from csvtest; +----+--------+ | id | name | +----+--------+ | 1 | mike | | 2 | jack | | 3 | Daniel | +----+--------+ 3 rows in set (0.00 sec)???根據CSV的特性,可以在數據庫運行時復制或者到導出文件,可以將Excel等電子表格中的數據存儲為CSV文件,然后復制到MySQL的目錄下面,就能在MySQL中打開使用。外部程序也可以從表的數據文件中讀取CSV格式的數據,因此CSV引擎可以作為數據交換的一種機制。
Memory
?? Memory存儲引擎使用存在于內存中的內容來創建表,Memory表至少比MyISAM表要快一個數量級,因為所有的數據都保存在內存中,不需要進行磁盤I/O,Meomory表的結構在重啟后還會保留,但是數據會丟失。Memory表支持Hash索引,是表級鎖,因此并發寫入的時候性能較低,并且不支持BLOB和TEXT類型的列,每行長度固定,即使指定了varchar類型,但是實際存儲的時候仍然會轉換成char。
Memory適用于下幾種場景:
-
用于查找或者映射表
-
用于緩存周期性聚合的數據,內容變化不頻繁的數據
-
用于保存數據分析中產生的中間數據
InnoDB和MyISAM的比較
InnoDB支持事務,MyISAM不支持事務
InnoDB支持行鎖,表鎖,MyISAM只支持表鎖,因此MyISAM不會發生死鎖,但是InnoDB會。
接上面一點,由于鎖級別的問題,MyISAM并發效率比InnoDB低
InnoDB支持外鍵,而MyISAM不支持
索引結構有區別,InnoDB有聚簇索引和非聚簇索引,聚簇索引的葉子節點保存了數據,MyISAM是非聚簇索 引,索引和數據文件是分離的,索引保存的是數據文件的指針。
Innodb存儲文件有frm、ibd,而Myisam是frm、MYD、MYI。
還有一個區別是查詢總數,InnoDB不保存表的具體行數,select count(*)的時候需要全表掃描,而 MyISAM用一個變量保存了整個表的行數,執行上述語句時只需要讀出該變量即可,速度很快
總結:選擇合適的引擎
?? MySQL有多種引擎,怎么基于業務規則與數據特點去選擇呢?大部分情況下,InnoDB都是比較合適的選擇,否則也不會是默認的存儲引擎了。因此,除非是需要用到InnoDB不具備的特性并且沒有其他辦法替代,否則都應該優先選擇InnoDB,像需要支持事務,在線熱備份、奔潰恢復等使用InnoDB都是非常正確的選擇。
作者:浪潮之巔
轉載自:
https://www.cnblogs.com/JackSparrow-/p/12039043.html
總結
以上是生活随笔為你收集整理的mysql存储引擎简介的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据湖,大数据的下一个变革!
- 下一篇: 每日两SQL(7),欢迎交流~