【MySQL】索引的那些前世今生

目錄

1.分類

1.1 按語法

1.2 按物理存儲結構

1.3 按數據結構

1.3.1 Btree索引

1.3.2 Hash索引

1.3 按字段數量

2. 設計索引

2.1 選擇合適的數據類型

3.命中索引


1.分類

1.1 按語法

類別 語法 描述
普通索引 index KEY `idx_pay_sp_order` (`F_sp_no`,`F_order_no`) 最基本的索引類型,沒有唯一性之類的限制
唯一索引 unique UNIQUE KEY `uk_trans_code` (`trans_code`) 不允許其中任何兩行具有相同索引值的索引
主鍵索引 key PRIMARY KEY (`F_id`)

唯一,聚集順序

全文索引 FULLTEXT KEY content_tag_fulltext(content,tag) 適用於大量的文本數據

1.2 按物理存儲結構

類別 描述
聚集索引 主鍵

一個表一個聚集索引。

數據和索引存放在同一文件中,以主鍵爲索引存儲數據

表中行的物理順序與鍵值的邏輯(索引)順序相同。

非聚集索引 普通字段

一個表多個非聚集索引

數據和索引分開單獨存放在不同的文件中,索引文件不存儲數據,而是存儲數據的地址或者主鍵

1.3 按數據結構

1.3.1 Btree索引

性質  
多叉

階m:叉數的最大值 

叉數限制:根節點最少可以有兩個分支[2,m]、非根非葉子的分支個數爲 [ ceil(m/2),m]

key數:(分叉數-1),葉最多m-1個

 

key有序

搜索樹

節點內有序,

節點間 大於左子,小於右子

葉子-數據頁

聚集:所有數據均存儲在葉子節點,葉子包含所有key,葉子成一個鏈

非聚集:存儲地址或者主鍵key

聚集索引

普通索引(二級)

1.3.2 Hash索引

類似內存中的HashMap

1.3 按字段數量

  • 單一索引
  • 組合索引

2. 設計索引

2.1 列選擇

原則 原因  
key 小

由於越小,一個索引頁存放的key越多,索引樹越矮

遍歷快、佔用內存小

整型 < date,time < char,varchar < blob
查詢頻繁的列 命中率高

where,<,<=,=,>,>=,between,in,like ‘xx%'

group by,order by,on從句中出現的列

離散度大 離散度越大,key越多,樹能越長大

count distinct key 越大,離散程度越高

COUNT(DISTINCT colNm) / COUNT(*)

2.2 設計規範

單個索引中每個索引記錄的長度不能超過64KB

單個表上的索引個數不能超過7個

分區表的分區字段(partition-key)必須有索引

3.命中索引

子句 使用限制
where

<,<=,=,>,>=,between,in

單個最左 like ‘xx%'

聯合-最左原則  index(a,b,c),where a

group by 最左
order by 最左
join xx on 最左
列 字符串 加上引號,隱式類型轉換,不會使用索引
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章