mysql索引的一些概念

2021-10-04 18:40:14 字數 1652 閱讀 9758

在mysql中,建立索引的時候一般可選的索引型別有

普通索引(normal),最基本的索引,沒有任何限制

唯一索引(unique),索引列的值必須唯一,但允許有空值,

全文索引(fulltext),效果類似like,但是比like效率高,多用於大文字欄位的檢索。

還有乙個主鍵索引,預設建表指定了主鍵就自動建立了主鍵索引,主鍵索引跟唯一索引的區別就是主鍵索引不允許為空

聚集索引

是指資料庫錶行中資料的物理順序與鍵值索引順序相同。乙個表只能有乙個聚集索引,因為乙個表的物理順序只有一種情況。可以這樣認為,主鍵索引就是聚集索引,因為乙個表只能有乙個主鍵,而且在b+樹中,肯定是存在乙個主鍵的,即使建表的時候不指定主鍵,它就會找到第乙個不為空並且所有值唯一的列作為主鍵去建立索引,如果都不合適,innodb也會預設給乙個主鍵rowid,而所有資料都是存在葉子節點中,而葉子節點存放的資料是跟主鍵一致的。

輔助索引

除了主鍵索引外其他的索引稱之為輔助索引,比如說下面以name為字段建立的索引就是輔助索引,輔助索引也有一棵自己的b+樹,也是存在ibd檔案中,但是跟主鍵索引又有點不同,它的葉子節點存放的是主鍵的id跟name的值,整個搜尋過程分為兩步走,第一步查詢where name = 『jack』,第二步根據name=jack對應的主鍵id去聚集索引樹找到對應id的完整資料,輔助索引會多掃瞄一棵b+樹,所以效率肯定比主鍵索引低,這種情況又稱之為回表

覆蓋索引

覆蓋索引是指從輔助索引中就可以直接查詢到結果,而不需要再走一遍主鍵索引的情況,比如select name from user where name = 『jack』,這種情況在輔助索引的樹中就已經拿到了jack,這時候不需要再進行一次回表了。減少了磁碟的io

離散度

我們一般建立索引的時候會考慮乙個離散度問題,所謂的離散度就是指列的資料重複程度,比如說性別,不是男就是女,這樣的列就不適合建立索引,因為這樣建立的索引樹左右子樹都是一樣了,去查詢的時候innodb也不知道走左邊還是走右邊,這樣還不如全表掃瞄,這樣導致的結果很可能就是索引不生效

聯合索引

聯合索引是指一次同時建立兩個或以上的列作為索引,聯合索引遵循最左匹配原則,對比的時候先對比最左邊的值,如果最左邊的值相同才會對比右邊的,走索引的情況是要包含最左邊的那個值,這裡如果phone和name在前或者後都會走索引,因為optimize優化器會自動調整順序使之符合最左匹配原則,如果查詢條件只是phone則不會走索引。

like前面帶%的情況也不會走索引,因為這也違反了最左匹配原則,因為最左匹配就是從最左邊第乙個字母對比的,而左邊帶了百分號就是說最左邊可能還有別的字母加入。

MySQL的一些重要概念

1 索引 主鍵 primary key 唯一鍵 unique 的區別 1 主鍵就是索引與唯一的結合 2 索引是為了讓資料檢索更快。3 唯一鍵約束此欄位不能有相同值,這樣能優化索引。4 全文搜尋是為了like關鍵字設計的 2 合理建立索引的建議 1 越小的資料型別通常更好 越小的資料型別通常在磁碟 記...

mysql索引技巧 MySql 索引的一些技巧

一 多表子從查詢 多表查詢時,子查詢可能會出現觸發不了索引的情況 select from test 1 where id in select id from test publish where id in 38,69 上面語句,test 1和test public都where了主鍵id,常理來說這...

MySql索引的一些資料

建立索引就是對資料進行排序,排序就是比較大小,b 樹其實就是幫助我們排序的一種資料結構。ps mysql 8.0 才支援索引降序排序 where條件能否利用索引本質上就是看條件能不能和某個b 樹索引進行比較大小。最左字首原則 本質上就是對由多個字段聯合組成的復合字段進行大小比較,類似字串比較大小,只...