MySQL 的存儲引擎是插件式的寒跳,不同的存儲引擎有不同的鎖機制较剃,其中我們最常到的兩個存儲引擎為 MyISAM 與 InnoDB缚柏。
???MyISAM 與 InnoDB的區(qū)別:
?MyISAM:
不支持事務,但是每次查詢都是原子的挽霉;
支持表級鎖,即每次操作是對整個表加鎖变汪;????
存儲表的總行數侠坎;
一個 MYISAM 表有三個文件:索引文件、表結構文件裙盾、數據文件实胸;
采用菲聚集索引,索引文件的數據域存儲指向數據文件的指針番官。輔索引與主索引?基本一致庐完,但是輔索引不用保證唯一性。?
????InnoDB:?
支持 ACID 的事務徘熔,支持事務的四種隔離級別门躯;
支持行級鎖及外鍵約束:因此可以支持寫并發(fā);
不存儲總行數:一個 InnoDb 引擎存儲在一個文件空間(共享表空間酷师,表大小不受操作系統(tǒng)控制讶凉,一個表可能分布在多個文件里),也有可能為多個(設置為獨立表空窒升,表大小受操作系統(tǒng)文件大小限制缀遍,一般為 2G),受操作系統(tǒng)文件大小的限制饱须;
主鍵索引采用聚集索引(索引的數據域存儲數據文件本身)域醇,輔索引的數據域存儲主鍵的值;因此從輔索引查找數據蓉媳,需要先通過輔索引找到主鍵值譬挚,再訪問輔索引;最好使用自增主鍵酪呻,防止插入數據時减宣,為維持 B+樹結構,文件的大調整玩荠。
? ??下面這個圖可能更直觀些:
MyISAM 與 InnoDB的索引實現:
????????MyISAM 的索引是非聚簇索引漆腌。索引文件和數據文件是分離的贼邓,底層是B+樹作為索引結構,葉子節(jié)點data存放的是數據記錄指針的地址闷尿,這種索引結構為非聚簇索引塑径。
????????myisam中索引檢索的算法為首先按照B+Tree搜索算法搜索索引,如果指定的Key存在填具,則取出其data域的值统舀,然后以data域的值為地址,讀取相應數據記錄劳景。結構如下圖:
????????InnoDB 的索引是聚簇索引誉简。與MyISAM 的區(qū)別就是InnoDB的數據文件就是索引文件,葉子節(jié)點data存放的是數據的整條記錄盟广。這種索引結構為聚簇索引闷串。
結構如下圖:
????????因為InnoDB的數據文件本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒有)
如果我們定義了主鍵(PRIMARY KEY)衡蚂,那么InnoDB會選擇其作為聚集索引窿克。
如果沒有顯式指定,則MySQL系統(tǒng)會自動選擇一個可以唯一標識數據記錄的列作為主鍵
如果不存在這種列毛甲,則MySQL自動為InnoDB表生成一個隱含字段作為主鍵年叮,這個字段長度為6個字節(jié),類型為長整形玻募。(隱含字段)
MyISAM 與 InnoDB的區(qū)別適用場景:
MyISAM 適合的場景為:
需要頻繁執(zhí)行全表 count 語句
對數據進行增刪改的頻率不高只损,查詢非常頻繁
沒有事務
MyISAM 使用的索引是非聚簇索引
InnoDB 適合的場景為:
數據增刪改查都比較頻繁
可靠性要求高,需要支持事務
使用聚簇索引
……………分割線……………
不積跬步七咧,無以至千里跃惫;不積小流,無以成江海艾栋。
關注我爆存,每天分享一些小知識點。分享自己的小心得蝗砾,包含但不限于初先较、中、高級面試題呦5苛浮O猩住!
我都墨跡這么半天了 扣猫,你不點關注菜循,不點贊,不收藏申尤,還不轉發(fā)癌幕,你想干啥Q酶!I自丁臭杰!