mysql 資料庫四種索引的基本使用

2021-09-19 12:19:35 字數 2121 閱讀 6995

主鍵索引:

主鍵是一種唯一性索引,但它必須指定為primary key,每個表只能有乙個主鍵。

唯一索引:

索引列的所有值都只能出現一次,即必須唯一,值可以為

普通索引 :

基本的索引型別,值可以為空,沒有唯一性的限制。 

全文索引:

全文索引的索引型別為fulltext。全文索引可以在varchar、char、text型別的列上建立。可以通過alter table或create index命令建立。對於大規模的資料集,通過alter table(或者create index)命令建立全文索引要比把記錄插入帶有全文索引的空表更快。myisam支援全文索引,innodb在mysql5.6之後支援了全文索引

1.為什麼我們新增完索引查詢速度為變快

傳統的查詢方法,是按照表的順序遍歷的,不論查詢幾條資料,mysql需要將表的資料從頭到尾遍歷一遍

在我們新增完索引之後,mysql一般通過btree演算法生成乙個索引檔案,在查詢資料庫時,找到索引檔案進行遍歷(折半查詢大幅查詢效率),找到相應的鍵從而獲取資料

2.索引的代價

2.1建立索引是為產生索引檔案的,占用磁碟空間

2.2索引檔案是乙個二叉樹型別的檔案,可想而知我們的dml操作同樣也會對索引檔案進行修改,所以效能會下降

3.在哪些column上使用索引?

3.1較頻繁的作為查詢條件字段應該建立索引 

3.2唯一性太差的字段不適合建立索引,儘管頻繁作為查詢條件,例如gender性別字段

3.3更新非常頻繁的字段不適合作為索引

3.4不會出現在where子句中的字段不該建立索引

總結: 滿足以下條件的字段,才應該建立索引.

a: 肯定在where條經常使用b: 該字段的內容不是唯一的幾個值c: 字段內容不是頻繁變化

hash

hash就是一種(key=>value)形式的鍵值對,如數學中的函式對映,允許多個key對應相同的value,但不允許乙個key對應多個value。正是由於這個特性,hash很適合做索引,hash索引可以一次定位。

侷限性1)hash 索引僅僅能滿足"=","in"和"<=>"查詢,不能使用範圍查詢。

(2)hash 索引無法被用來避免資料的排序操作。

由於 hash 索引中存放的是經過 hash 計算之後的 hash 值,而且hash值的大小關係並不一定和 hash 運算前的鍵值完全一樣,所以資料庫無法利用索引的資料來避免任何排序運算;

(3)hash 索引不能利用部分索引鍵查詢。

對於組合索引,hash 索引在計算 hash 值的時候是組合索引鍵合併後再一起計算 hash 值,而不是單獨計算 hash 值,所以通過組合索引的前面乙個或幾個索引鍵進行查詢的時候,hash 索引也無法被利用。

(4)hash 索引在任何時候都不能避免表掃瞄。

btree

btree索引就是一種將索引值按一定的演算法,存入乙個樹形的資料結構中

btree在myisam裡的形式和innodb稍有不同

在 innodb裡,有兩種形態:一是primary key形態,其leaf node裡存放的是資料,而且不僅存放了索引鍵的資料,還存放了其他欄位的資料。二是secondary index,其leaf node和普通的btree差不多,只是還存放了指向主鍵的資訊.

而在myisam裡,主鍵和其他的並沒有太大區別。不過和innodb不太一樣的地方是在myisam裡,leaf node裡存放的不是主鍵的資訊,而是指向資料檔案裡的對應資料行的資訊.

MYSQL資料庫四種索引型別介紹

主鍵索引 主鍵是一種唯一性索引,但它必須指定為primary key,每個表只能有乙個主鍵。唯一索引 索引列的所有值都只能出現一次,即必須唯一,值可以為空。普通索引 基本的索引型別,值可以為空,沒有唯一性的限制。全文索引 全文索引的索引型別為fulltext。全文索引可以在varchar char ...

MYSQL資料庫四種索引型別的簡單使用

mysql資料庫索引型別包括普通索引,唯一索引,主鍵索引與組合索引,這裡對這些索引的做一些簡單描述 1 普通索引 這是最基本的mysql資料庫索引,它沒有任何限制。它有以下幾種建立方式 建立索引 create index indexname on mytable username length 如果...

MYSQL資料庫四種索引型別的簡單使用

mysql資料庫索引型別包括普通索引,唯一索引,主鍵索引與組合索引,這裡對這些索引的做一些簡單描述 1 普通索引 這是最基本的mysql資料庫索引,它沒有任何限制。它有以下幾種建立方式 建立索引 create index indexname on mytable username length 如果...