MySQL的索引和儲存引擎

2021-10-08 11:09:32 字數 3598 閱讀 4291

參考文章內容:mysql索引 - 黃文博 -

mysql入門教程(mysql tutorial book)

二、關於索引

資料庫儲存引擎是資料庫底層軟體組織,資料庫管理系統(dbms)使用資料引擎進行建立、查詢、更新和刪除資料。

不同的儲存引擎提供不同的儲存機制、索引技巧、鎖定水平等功能,使用不同的儲存引擎,還可以獲得特定的功能。

oracle 和sql server等資料庫中只有一種儲存引擎。

mysql資料庫提供了多種儲存引擎,被稱為「pluggable storage engine architecture」(可替換儲存引擎架構)的特性。

使用者可以根據不同的需求為資料表選擇不同的儲存引擎,使用者也可以根據自己的需要編寫自己的儲存引擎。

mysql資料庫在實際的工作中其實分為了語句分析層儲存引擎層

其中語句分析層就主要負責與客戶端完成連線並且事先分析出sql語句的內容和功能。

儲存引擎層則主要負責接收來自語句分析層的分析結果,完成相應的資料輸入輸出和檔案操作。

儲存引擎說白了就是如何儲存資料、如何為儲存的資料建立索引和如何更新、查詢資料等技術的實現方法。

因為在關聯式資料庫中資料的儲存是以表的形式儲存的,所以儲存引擎也可以稱為表型別(即儲存和操作此表的型別)。

儲存引擎主要有: 1. myisam , 2. innodb, 3. memory, 4. archive, 5. federated 。

myisam是mysql5.5版本以前預設的資料庫引擎。

這種引擎是mysql最早提供的。這種引擎又可以分為靜態myisam、動態myisam 和壓縮myisam三種:

當然不管是何種myisam表,目前它都不支援事務,行級鎖和外來鍵約束的功能,這就意味著有事務處理需求的表,不能使用myisam儲存引擎。myisam儲存引擎特別適合在以下幾種情況下使用:

innodb是mysql5.5版本以後預設的儲存引擎。

innodb表型別可以看作是對myisam的進一步更新產品,它提供了事務、行級鎖機制和外來鍵約束的功能。

innodb的表需要更多的記憶體和儲存,它會在主記憶體中建立其專用的緩衝池用於高速緩衝資料和索引。 使用innodb是最理想的選擇:

yisam是mysql5.5版之前的預設資料庫引擎。雖然效能極佳,⽽且提供了⼤量的特性,包括全⽂索引、壓縮、空間函式等,但myisam不⽀持事務和⾏級鎖,⽽且最⼤的缺陷就是崩潰後⽆法安全恢復。不過,5.5版本之後,mysql引⼊了innodb(事務性資料庫引擎),mysql 5.5版本後預設的儲存引擎為innodb。

⼤多數時候我們使⽤的都是 innodb 儲存引擎,但是在某些情況下使⽤ myisam 也是合適的⽐如讀密集的情況下。(如果你不介意 myisam 崩潰恢復問題的話)。

兩者的對⽐:

是否⽀持⾏級鎖 : myisam 只有表級鎖(table-level locking),⽽innodb ⽀持⾏級鎖(row-level locking)和表級鎖,預設為⾏級鎖。

是否⽀持事務和崩潰後的安全恢復: myisam 強調的是效能,每次查詢具有原⼦性,其執⾏速度⽐innodb型別更快,但是不提供事務⽀持。但是innodb 提供事務⽀持事務,外部鍵等⾼級資料庫功能。 具有事務(commit)、回滾(rollback)和崩潰修復能⼒(crash recovery capabilities)的事務安全(transaction-safe (acid compliant))型表。

是否⽀持外來鍵: myisam不⽀持,⽽innodb⽀持。

是否⽀持mvcc :僅 innodb ⽀持。應對⾼併發事務, mvcc⽐單純的加鎖更⾼效;mvcc只在read committed 和 repeatable read 兩個隔離級別下⼯作;mvcc可以使⽤ 樂觀(optimistic)鎖 和 悲觀(pessimistic)鎖來實現;各資料庫中mvcc實現並不統⼀。

可閱讀:mysql-innodb-mvcc多版本併發控制 - 程式設計空間 - segmentfault 思否

索引是加快我們查詢資料的利器,mysql中的索引有很多種型別,它們是在儲存引擎層實現的,這意味著不同的儲存引擎支援的索引型別可能不同,即使相同,底層工作原理也可能不同。

mysql索引使⽤的資料結構主要有btree索引雜湊索引

對於雜湊索引來說,底層的資料結構就是雜湊表,因此在絕⼤多數需求為單條記錄查詢的時候,可以選擇雜湊索引,查詢效能最快;其餘⼤部分場景,建議選擇btree索引

mysql的btree索引使⽤的是b樹中的b+tree。

myisam: b+tree葉節點的data域存放的是資料記錄的位址。

在索引檢索的時候,⾸先按照b+tree搜尋演算法搜尋索引,如果指定的key存在,則取出其 data 域的值,然後以 data 域的值為位址讀取相應的資料記錄。這被稱為「⾮聚簇索引」。

innodb: 其資料⽂件本身就是索引⽂件。

相⽐myisam,索引⽂件和資料⽂件是分離的,其表資料⽂件本身就是按b+tree組織的⼀個索引結構,樹的葉節點data域儲存了完整的資料記錄。

這個索引的key是資料表的主鍵,因此innodb表資料⽂件本身就是主索引。這被稱為「聚簇索引(或聚集索引)」。

⽽其餘的索引都作為輔助索引,輔助索引的data域儲存相應記錄主鍵的值⽽不是位址,這也是和myisam不同的地⽅。

在根據主索引搜尋時,直接找到key所在的節點即可取出資料;在根據輔助索引查詢時,則需要先取出主鍵的值,再⾛⼀遍主索引。

因此,在設計表的時候,不建議使⽤過⻓的字段作為主鍵,也不建議使⽤⾮單調的字段作為主鍵,這樣會造成主索引頻繁**。

b+樹的特性:

1、b+樹將所有的查詢結果放在葉子節點中,這也就意味著查詢b+樹,就必須到葉子節點才能返回結果;

2、b+樹每乙個節點的關鍵字個數和子樹指標個數相同;

3、b+樹的非葉子節點的每乙個關鍵字對應乙個指標,而關鍵字則是子樹的最大,或者最小值;

MySql儲存引擎和索引

mysql的儲存引擎表示的是mysql中資料庫表的儲存型別,不同儲存型別,表的儲存方式都不相同。檢視當前mysql版本支援哪些引擎,可以輸入以下命令 mysql show engines g 可以發現有很多儲存引擎,這裡只討論innodb myisam memory這三種。innodb innodb...

MySQL索引 事務 儲存引擎

索引建立的方法 建立索引的原則依據 檢視索引的方法 刪除索引的方法 事務的概念 事務的acid特點 事務控制語句 事務的控制方法 儲存引擎概念介紹 業選擇儲存引擎依據 修改儲存引擎 注 no unique為0 注 no unique為1 注 屬於唯一性索引的一種 直接建立索引 修改表結構方式新增索引...

mysql儲存引擎的索引區別

mysql儲存引擎的索引區別,這裡只說明myisam和innodb 1.myisam是非聚集索引,它的索引檔案和資料檔案是分離的,底層是通過hash位址指向磁碟的資料位置的,hash位址無法解決範圍查詢 2.innodb的索引是聚集索引,資料檔案和索引檔案是同乙個,資料檔案就是按照b tree組織的...