「Mysql索引原理(一)」1.存儲(chǔ)引擎簡介

存儲(chǔ)引擎

0. 前言
1. 存儲(chǔ)引擎查看
2. InnoDB存儲(chǔ)引擎特性存儲(chǔ)InnoDB歷史
3. MyISAM存儲(chǔ)引擎前言特性加鎖與并發(fā)修復(fù)索引特性延遲更新索引鍵存儲(chǔ)壓縮表性能
4. InnoDB和MyISAM對(duì)比
5. MySQL其他存儲(chǔ)引擎MEMORY存儲(chǔ)引擎ARCHIVE存儲(chǔ)引擎CSV存儲(chǔ)引擎如何選擇合適的存儲(chǔ)引擎

0. 前言

? ? ? ?數(shù)據(jù)庫存儲(chǔ)引擎是數(shù)據(jù)庫底層軟件組織,數(shù)據(jù)庫管理系統(tǒng)使用數(shù)據(jù)引擎進(jìn)行創(chuàng)建、查詢、更新和刪除數(shù)據(jù)。不同的存儲(chǔ)引擎提供不同的存儲(chǔ)機(jī)制、索引技巧、鎖定水平等功能,使用不同的存儲(chǔ)引擎,還可以獲得特定的功能?,F(xiàn)在許多不同的數(shù)據(jù)庫管理系統(tǒng)都支持多種不同的數(shù)據(jù)引擎。

1. 存儲(chǔ)引擎查看

使用命令SHOW ENGINES來查看MySQL使用的引擎

MySQL使用的引擎

查看數(shù)據(jù)庫默認(rèn)引擎 :
SHOW VARIABLES LIKE 'storage_engine';

2. InnoDB存儲(chǔ)引擎

特性

1、是Mysql默認(rèn)的事務(wù)型引擎,也是最重要、使用最廣泛的存儲(chǔ)引擎。
2、高性能和自動(dòng)崩潰恢復(fù)特性
3、InnoDB是為處理巨大數(shù)據(jù)量的最大性能設(shè)計(jì)。
4、InnoDB存儲(chǔ)引擎完全與MySQL服務(wù)器整合,InnoDB存儲(chǔ)引擎維持它自己的緩沖池。
5、InnoDB支持外鍵完整性約束,存儲(chǔ)表中的數(shù)據(jù)時(shí),每張表的存儲(chǔ)都按主鍵順序存放。
6、InnoDB被用在眾多需要高性能的大型數(shù)據(jù)庫站點(diǎn)上
7、作為事務(wù)型的存儲(chǔ)引擎,InnoDB通過一些機(jī)制和工具支持真正的熱備份。
8、InnoDB表是基于聚簇索引建立的。
? ? ? ?使用InnoDB時(shí),MySQL將在MySQL數(shù)據(jù)目錄下創(chuàng)建一個(gè)名為ibdata1的10MB大小的自動(dòng)擴(kuò)展數(shù)據(jù)文件,以及兩個(gè)名為ib_logfile0和ib_logfile1的5MB大小的日志文件用于支持事務(wù)的持久性。

存儲(chǔ)

? ? ? ?存儲(chǔ)文件:表空間文件、重做日志文件。

? ? ? ?表空間文件:InnoDB引擎將存儲(chǔ)的數(shù)據(jù)按照表空間進(jìn)行存放的設(shè)計(jì)。在默認(rèn)配置下有一個(gè)初始大小10M,名為ibdata1的文件。該文件就是默認(rèn)的表空間文件,可以通過innodb_data_file_path參數(shù)配置,格式如下:

innodb_data_file_path = datafile1_spec1
 [;datafile2_spec2]...

? ? ? ?用戶通過多個(gè)文件組成表空間,同時(shí)制定文件的屬性,如:innodb_data_file_path = c:/innodb:2000M;d:/innodb2:2000M,innodb_file_per_table參數(shù),則每個(gè)InnoDB表產(chǎn)生一個(gè)獨(dú)立的表空間。命名規(guī)則 表名.ibd,不再將所有數(shù)據(jù)存放在默認(rèn)的表空間。

? ? ? ?日志文件
? ? ? ?ib_logfile0、ib_logfile1。這兩個(gè)就是重做日志文件。每個(gè)InnoDB引擎至少有一個(gè)重做日志文件組,每個(gè)文件組至少兩個(gè)重做日志文件。影響重做日志屬性的參數(shù)有:
? ? ? ?? ? ? ?1. innodb_log_file_size 每個(gè)重做日志的大小
? ? ? ?? ? ? ?2. innodb_log_files_in_group 重做文件日志組中日志文件的數(shù)量,默認(rèn)為2。
? ? ? ?? ? ? ?3. innodb_mirrored_log_groups 日志鏡像文件組的數(shù)量,默認(rèn)1。表示只有一個(gè)日志文件組,沒有鏡像。
? ? ? ?? ? ? ?4. innodb_log_group_home_dir 日志文件組所在路徑,默認(rèn)./ 表示在MySQL的數(shù)據(jù)目錄下。

InnoDB歷史

? ? ? ?2008年,InnoDB plugin,適用于Mysql 5.1版本。

? ? ? ?Oracle收購sun,Mysql5.5

3. MyISAM存儲(chǔ)引擎

前言

? ? ? ?在Mysql5.1及之前的版本,MyISAM是默認(rèn)的存儲(chǔ)引擎。MyISAM提供了大量的特性,包括全文索引、壓縮、空間函數(shù)(GIS)等,但MyISAM不支持事務(wù)和行級(jí)鎖,一個(gè)事務(wù)插入時(shí),會(huì)將整個(gè)表鎖住。而且有一個(gè)毫無疑問的缺陷就是崩潰后無法完全恢復(fù)。
? ? ? ?盡管如此,MyISAM絕不是一無是處的,對(duì)于只讀的數(shù)據(jù),或者表比較小、可以忍受修復(fù)操作,則依然可以繼續(xù)使用MyISAM引擎。

特性

加鎖與并發(fā)

MyISAM對(duì)整張表加鎖,而不是針對(duì)行。

修復(fù)

? ? ? ?對(duì)于MyISAM表,MySQL可以手工或自動(dòng)執(zhí)行檢查和修復(fù)操作,但這里說的修復(fù)和事務(wù)恢復(fù)以及崩潰恢復(fù)是不同的概念。執(zhí)行表的修復(fù)可能導(dǎo)致一些數(shù)據(jù)丟失,而且修復(fù)操作是非常慢的??梢酝ㄟ^CHECK TABLE mytable檢查表的錯(cuò)誤,如果有錯(cuò)誤可以通過執(zhí)行REPAIR TABLE mystable進(jìn)行修復(fù)。另外,如果MySQL服務(wù)器已經(jīng)關(guān)閉,也可以通過myisamchk命令工具進(jìn)行檢查和修復(fù)操作。

索引特性

? ? ? ?對(duì)于MyISAM表,即使是BLOB和TEXT等字段,也可以基于前500個(gè)字符創(chuàng)建索引。MyISAM也支持全文索引,這是一種基于分詞創(chuàng)建的索引,可以支持復(fù)雜的查詢。

延遲更新索引鍵

? ? ? ?創(chuàng)建MyISAM表的時(shí)候,如果指定了DELAY_KEY_WRITE選項(xiàng),在每次修改執(zhí)行完成時(shí),不會(huì)立刻將修改的索引數(shù)據(jù)寫入磁盤 ,而是會(huì)寫到內(nèi)存中的鍵緩沖區(qū),只有在清理鍵緩沖區(qū)或者關(guān)閉表的時(shí)候才會(huì)將對(duì)應(yīng)的索引快寫入到磁盤。
? ? ? ?使用MyISAM引擎創(chuàng)建數(shù)據(jù)庫,將產(chǎn)生3個(gè)文件。文件的名字以表名字開始,擴(kuò)展名之處文件類型:frm文件存儲(chǔ)表定義、數(shù)據(jù)文件的擴(kuò)展名為.MYD(MYData)、索引文件的擴(kuò)展名時(shí).MYI(MYIndex)

存儲(chǔ)

? ? ? ?數(shù)據(jù)文件和索引文件,分別以.MYD和.MYI為擴(kuò)展名。

壓縮表

? ? ? ?如果表在創(chuàng)建并導(dǎo)入數(shù)據(jù)以后,不會(huì)再進(jìn)行修改操作,那么這樣的表或許適合采用MyISAM壓縮表。
? ? ? ?可以使用myisampack對(duì)MyISAM表進(jìn)行壓縮(也較打包pack)。

性能

? ? ? ?MyISAM有一些服務(wù)器級(jí)別的性能擴(kuò)展限制,比如對(duì)索引鍵緩沖區(qū)(key cache)的Mutex鎖,MariaDB基于段(segment)的索引鍵緩沖區(qū)機(jī)制。但MyISAM最典型的性能問題還是表鎖的問題,如果你發(fā)現(xiàn)所有的查詢都長期處于“Locked”狀態(tài),那么毫無疑問表鎖就是罪魁禍?zhǔn)住?/p>

4. InnoDB和MyISAM對(duì)比

? ? ? ?1、由于鎖粒度的不同,InnoDB比MyISAM支持更高的并發(fā);
? ? ? ?2、InnoDB為行級(jí)鎖,MyISAM為表級(jí)鎖。
? ? ? ?3、在備份容災(zāi)上,InnoDB支持在線熱備,有很成熟的在線熱備解決方案;
? ? ? ?4、查詢性能上,MyISAM的查詢效率高于InnoDB。
? ? ? ?5、SELECT COUNT(*) 語句,如果行數(shù)在千萬級(jí)別以上,MyISAM可以快速查出,而InnoDB查詢的特別慢。
? ? ? ?6、MyISAM的表結(jié)構(gòu)文件包括:.frm(表結(jié)構(gòu)定義),.MYI(索引),.MYD(數(shù)據(jù));
而InnoDB的表數(shù)據(jù)文件為:.ibd和.frm(表結(jié)構(gòu)定義);

5. MySQL其他存儲(chǔ)引擎

MEMORY存儲(chǔ)引擎

將數(shù)據(jù)存在內(nèi)存中,和市場上的Redis,memcached等思想類似,為了提高數(shù)據(jù)的訪問速度,主要特點(diǎn):
(1)支持的數(shù)據(jù)類型有限制
(2)支持的鎖粒度為表級(jí)鎖。
(3)由于數(shù)據(jù)是存放在內(nèi)存中,所以在服務(wù)器重啟之后,所有數(shù)據(jù)都會(huì)丟失;
(4)查詢的時(shí)候,如果有用到臨時(shí)表,而且臨時(shí)表中有BLOB,TEXT類型的字段,那么這個(gè)臨時(shí)表就會(huì)轉(zhuǎn)化為MyISAM類型的表,性能會(huì)急劇降低;

ARCHIVE存儲(chǔ)引擎

ARCHIVE存儲(chǔ)引擎適合的場景有限,由于其支持壓縮,故主要是用來做日志,流水等數(shù)據(jù)的歸檔,主要特點(diǎn):
(1)支持Zlib壓縮,數(shù)據(jù)在插入表之前,會(huì)先被壓縮;

(2)僅支持SELECT和INSERT操作,存入的數(shù)據(jù)就只能查詢,不能做修改和刪除;

(3)只支持自增鍵上的索引,不支持其他索引;

CSV存儲(chǔ)引擎

數(shù)據(jù)中轉(zhuǎn)試用,主要特點(diǎn):

(1)其數(shù)據(jù)格式為.csv格式的文本,可以直接編輯保存;

(2)導(dǎo)入導(dǎo)出比較方便,可以將某個(gè)表中的數(shù)據(jù)直接導(dǎo)出為csv,試用Excel辦公軟件打開;

如何選擇合適的存儲(chǔ)引擎

1、使用場景是否需要事務(wù)支持;

2、是否需要支持高并發(fā),InnoDB的并發(fā)度遠(yuǎn)高于MyISAM;

3、是否需要支持外鍵;

4、是否需要支持在線熱備;

5、高效緩沖數(shù)據(jù),InnoDB對(duì)數(shù)據(jù)和索引都做了緩沖,而MyISAM只緩沖了索引;

6、索引,不同存儲(chǔ)引擎的索引并不太一樣;

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容