MySQL之索引介紹

2021-08-17 17:13:38 字數 1932 閱讀 4533

在關聯式資料庫中,索引是一種單獨的、物理的對資料庫表中一列或多列的值進行排序的一種儲存結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的資料頁的邏輯指標清單。索引的作用相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。

索引分類:

從資料結構角度來分

btree 索引

hash索引

btree索引

當人們談論索引,如果沒有指明型別,多半是b-tree索引,它使用b-tree資料結構來儲存資料。

21億資料只需要查詢32次,相對於21億次快了很多。

hash索引:

基於雜湊表實現,對於每一行資料,儲存引擎會計算乙個雜湊碼,雜湊碼儲存在索引中,雜湊表儲存指向每個資料行的指標。

速度快,一次計算 就可以取到資料

1.只能用於memory儲存引擎

memory表儲存引擎,是記憶體表儲存引擎,他會把表的資料全部放到記憶體中。

mysql重啟之後,會全部清空。

原理圖:

hash索引缺點:

1.      通過hash函式算出來的位址可能會產生衝突,此時mysql通過鍊錶的方式來解決這種衝突資料,維護索引欄位的值就比較麻煩,代價比較高

2.      hash索引資料沒有順序的,因為hash函式算出來的值的排序不是順序的,他會產生空間碎片

3.      hash索引只支援等值比較(in , = , <=>)查詢,不適合範圍查詢

4.      無法使用最左字首原則,例如:hash索引(col1,col2,col3),如果where條件中,只包含col1欄位,是無法用上索引的,因為兩次計算的hash值都不一樣,所以用不上hash索引

5.      col like 『abc%』 在hash索引中用不上索引

自適應雜湊索引:

innodb引擎有乙個特殊的功能叫做自適應雜湊索引。當innodb注意到某些索引值被使用得非常頻繁時,它會在記憶體中基於b-tree索引之上再建立乙個雜湊索引。

插入的時候,利用觸發器生成雜湊值。

查詢的時候因為有雜湊衝突的問題,必須包含常量。

crc32是計算雜湊值的。

索引的優點:

提高檢索速度,降低磁碟讀取io

索引是排序好的,降低了資料排序的運算成本,也就是降低了cpu的消耗

索引的缺點:

索引也需要儲存,所以也需要空間,實際上索引也是一張表,儲存了索引欄位的值和指向實體表的指標。

降低更新表的速度,更新不僅僅只是資料本身,如果資料正好是索引字段,同時需要更新索引資訊。

哪些情況下適合建索引

1. 頻繁作為where條件語句查詢的字段

2. 關聯字段需要建立索引,例如外來鍵字段,student表中的classid,   classes表中的schoolid 等

3. 排序字段可以建立索引

4. 分組字段可以建立索引,因為分組的前提是排序

5. 統計字段可以建立索引,例如count(),max()

哪些情況下不適合建索引

1.頻繁更新的字段不適合建立索引,比如登入次數

2.where條件中用不到的字段不適合建立索引

3.表資料可以確定比較少的不需要建索引

4.資料重複且發布比較均勻的的字段不適合建索引(唯一性太差的字段不適合建立索引),例如性別,真假值

5. 參與列計算的列不適合建索引

參考 1.young

2.《mysql高效能3》

Mysql之索引的簡單介紹

幾乎所有的索引都是建立在字段之上 索引 系統根據某種演算法,將已有的資料 未來可能新增的資料 單獨建立乙個檔案 檔案能夠實現快速的匹配資料,並且能夠快速的找到對應表中的記錄 索引的意義 1.提公升查詢資料的效率 2.約束資料的有效性 唯一性等 增加索引的前提條件,索引本身就會產生索引檔案 有時候有可...

MySQL索引介紹

索引由資料庫表中一列或者多列組合而成,其作用是提高對錶中資料的查詢速度。建立索引是指在某個表的一列或者多列上建立乙個索引,用來提高對錶的訪問速度,建立索引由三種方法 在建立表的時候建立,在已存在的表上建立和用alter table語句建立。建立索引的基本語法格式 asc引數表示公升序排列,desc引...

MySQL索引介紹

簡單理解為 排好序的快速查詢資料結構 一般來說索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存在磁碟上。我們平常所說的索引,如果沒有特別指明,一般都是指b樹結構組織的索引 b 樹索引 b 樹索引檢索原理 1 類似圖書館書目索引,提高資料檢索的效率,降低資料庫的io成本。2 ...