什么是索引?
索引是關(guān)系數(shù)據(jù)庫中對某一列或多個(gè)列的值進(jìn)行預(yù)排序的數(shù)據(jù)結(jié)構(gòu)。通過索引,可以讓數(shù)據(jù)庫不必全表掃描,直接快速訪問到符合條件的記錄,大大加快了查詢速度。
索引的效率,優(yōu)點(diǎn),缺點(diǎn)
索引的效率取決于索引列的值是否散列,即該列的值如果越互不相同,那么索引效率越高。反過來,如果記錄的列存在大量相同的值,例如性別列,50%男,50%女,因此,對該列創(chuàng)建索引就沒有意義??梢詫σ粡埍韯?chuàng)建多個(gè)索引。索引的優(yōu)點(diǎn)是提高了查詢效率,缺點(diǎn)是在插入、更新和刪除記錄時(shí),需要同時(shí)修改索引,因此,索引越多,插入、更新和刪除記錄的速度就越慢。
什么情況下需要/不建或少建立索引
需要
1、頻繁作為查詢條件的字段
2、排序的字段
3、與其他表關(guān)聯(lián)的字段
不建或少建
1、表記錄太少
2、經(jīng)常增刪改的表
3、數(shù)據(jù)重復(fù)且分布平均的表字段,比如性別字段50%男 %50女,建立索引也不會(huì)提高查詢效率
為什么加索引后會(huì)使查詢變快?
在MySQL中, 索引有兩種分類方式:邏輯分類和物理分類。
按照邏輯分類,索引可分為:
①主鍵索引:一張表只能有一個(gè)主鍵索引,不允許重復(fù)、不允許為 NULL;
②唯一索引:數(shù)據(jù)列不允許重復(fù),允許為 NULL 值,一張表可有多個(gè)唯一索引,但是一個(gè)唯一索引只能包含一列
③普通索引:一張表可以創(chuàng)建多個(gè)普通索引,一個(gè)普通索引可以包含多個(gè)字段,允許數(shù)據(jù)重復(fù),允許 NULL 值插入;
④全文索引:讓搜索關(guān)鍵詞更高效的一種索引。
全文索引和like + %有什么不同?
like + % 在文本比較少時(shí)是合適的,但是對于大量的文本數(shù)據(jù)檢索,是不可想象的。全文索引在大量的數(shù)據(jù)面前,能比 like + % 快 N 倍
⑤組合索引:為了提高mysql效率可建立組合索引,遵循”最左前綴”原則。
按照物理分類,索引可分為:
①聚集索引:以主鍵創(chuàng)建的索引;聚集索引的葉子節(jié)點(diǎn)存儲(chǔ)的是表中的數(shù)據(jù);
②非聚集索引:非主鍵創(chuàng)建的索引;非聚集索引在葉子節(jié)點(diǎn)存儲(chǔ)的是主鍵和索引列;使用非聚集索引查詢數(shù)據(jù),會(huì)查詢到葉子上的主鍵,再根據(jù)主鍵查到數(shù)據(jù)(這個(gè)過程叫做回表)。
在未加索引時(shí),根據(jù)條件查詢到一條數(shù)據(jù)后并不會(huì)停止查詢,因?yàn)榭赡苓€會(huì)有條件相同的記錄,這就是所謂的全表掃描。加上索引后,會(huì)查詢到葉子上的主鍵和索引列,再根據(jù)主鍵查到數(shù)據(jù),不會(huì)進(jìn)行全表掃描所以查詢速度會(huì)變快。
為什么 B+ Tree 索引會(huì)降低新增、修改、刪除的速度?
①B+ Tree 是一顆平衡樹,如果對這顆樹新增、修改、刪除的話,會(huì)破壞它的原有結(jié)構(gòu);
②我們在做數(shù)據(jù)新增、修改、刪除的時(shí)候,需要花額外的時(shí)間去維護(hù)索引;
③正因?yàn)檫@些額外的開銷,導(dǎo)致索引會(huì)降低新增、修改、刪除的速度。
索引失效的場景
①對索引字段進(jìn)行了運(yùn)算或者使用了函數(shù)
②表中字段的數(shù)據(jù)類型和查詢的字段類型不一致
③違反了索引的最左匹配原則
④模糊匹配 LIKE’%sql%’ 模糊匹配連最開始的字符串都不確定,所以不會(huì)走索引,LIKE’sql%’這個(gè)是會(huì)走索引的。
⑤優(yōu)化器認(rèn)為全表掃描更快
舉個(gè)例子:如果數(shù)據(jù)有10萬條,要查詢的where age > 20 可能有9萬多條。查詢?nèi)f9萬條還要回表,優(yōu)化器分析還不如進(jìn)行全表掃描
EXPLAIN 結(jié)果中的type字段
system:系統(tǒng)表,少量數(shù)據(jù),往往不需要進(jìn)行磁盤IO
const:常量連接
eq_ref:主鍵索引(primary key)或者非空唯一索引(unique not null)等值掃描
ref:非主鍵非唯一索引等值掃描
range:范圍掃描
index:索引樹掃描
ALL:全表掃描(full table scan)
type掃描方式由快到慢
system > const > eq_ref > ref > range > index > ALL