關係型資料庫之索引

zyhmz發表於2018-07-07

索引,在我們的mysql中的也叫key,是儲存引擎中用於快速找到記錄的一種資料結構。這是索引的基本功能,當然,索引還有一些別的屬性。但是《高效能mysql》這本書上並沒有講清楚一個事情,那就是索引和主鍵的區別。主鍵一定是唯一性索引,唯一性索引並不一定就是主鍵。我來來具體的東西說吧,書大家都看過吧,看下它每頁是不是有個頁碼,我們的資料表主鍵就相當於是這個頁碼。索引相當於書的目錄,有了目錄我們可以很快的知道這本書的基本內容和結構,資料索引也一樣,它可以加快資料表的查詢速度。

索引對於良好的效能特別關鍵,尤其是當表中的資料量越來越大的時候,索引對於效能的影響愈發重要。在資料量小並且負載比較低的時候,不恰當的索引對效能的影響可能還不是太明顯,但是當資料量增大的時候,效能會急劇地下降。

在mysql中,我們看看究竟是如何使用索引的,先看看一條sql語句:

select firsr_name from student where student_id = 5

如果我們在student_id列上有建索引,則mysql將使用該索引找到student_id為5的列,也就是說,mysql先在索引上按值進行查詢,然後返回所有包含該值的資料行。
索引中可以包含一個或者多個的列,如果索引包含多個列,那麼列的順序也是非常重要的。因為mysql只能高效地使用索引的最左字首列,建立一個包含兩個列的索引,和建立兩個只包含一列的索引是大不相同的。

ORM中的索引
我們知道,現在多種語言都封裝了ORM,節省了很多我們資料庫查詢的成本。ORM工具能夠產生符合邏輯的,合法的查詢,但是它很難生成適合索引的查詢。待補充

索引的型別
索引有很重型別,可以為不同的場景提供更好的效能。我們先來看看mysql支援的索引型別,以及他們的優缺點。索引歸根結底,是一個查詢的問題。

先來看看B-tree索引,人們談論索引的時候,如果沒有特別指明的型別,我們一般指的是B-tree索引,它使用B-tree這種資料結構來儲存資料。關於B-tree的概念,我會在資料結構與演算法的章節中著重去回顧和理解。這裡只是簡要的說一說B-tree在我們的資料庫中應該如何去使用。B-tree索引能夠加快訪問資料的速度,因為儲存引擎不再需要進行全表的掃描來獲取需要的資料。取而代之的是從索引的根結點進行搜尋。根節點的槽中存放了指向子節點的指標,儲存引擎根據這些指標向下查詢。通過比較節點頁的值和要查詢的值可以找到合適的指標進入下層子節點,這些指標實際上定義了子節點中值的上限和上限。最終儲存引擎要麼是找到對應的值,要麼記錄不存在。葉子節點比較特別,它們的指標指向的是被索引的資料,而不是其他的節點頁。

好,讓我們來建立一個table,看看B-tree到底是怎麼儲存的。

相關文章