- 當(dāng)使用索引列進(jìn)行查詢的時(shí)候,盡量不要使用表達(dá)式,把計(jì)算放到業(yè)務(wù)層而不是數(shù)據(jù)庫(kù)層
select * from user where age + 1 = 2;
- 盡量使用主鍵查詢,而不是其他索引,減少回表查詢的觸發(fā)
自然主鍵、代理主鍵(與業(yè)務(wù)層面無關(guān),比如 id)
使用前綴索引
使用索引掃描來排序
explain …… /G
using filesort
- union all , in , or 都能使用索引,但推薦使用 in
如果是單列索引,or 會(huì)走索引的
如果是組合索引,所有列都必須包含(id 主鍵不算),or 才會(huì)走索引
- 范圍列可以用到索引
范圍條件是: >, >=, <, <=, between
范圍列可以用到索引,但范圍列后面的列無法使用到索引,索引最多用于一個(gè)范圍列
- 強(qiáng)制類型轉(zhuǎn)換、隱式類型轉(zhuǎn)換會(huì)發(fā)生全表掃描(避免強(qiáng)制類型轉(zhuǎn)換)
# 如果 phone 字段為 varchar 類型
# 不會(huì)走索引
select * from user where phone = 137……;
# 走索引
select * from user where phone = '137……';
- 更新十分頻繁,數(shù)據(jù)區(qū)分度不高的字段上不宜建立索引
- 更新會(huì)變更 B+樹,更新頻繁字段建立索引會(huì)大大降低數(shù)據(jù)庫(kù)性能
- 類似性別這類區(qū)分不大的字段,建立索引是沒有意義的,不能有效過濾數(shù)據(jù)
- 一般區(qū)分度在80%以上的時(shí)候就可以建立索引,區(qū)分度可以用
count(distinct(列名))/count(*)來計(jì)算
創(chuàng)建索引列,不允許為null,可能會(huì)得到不符合預(yù)期的結(jié)果
當(dāng)需要進(jìn)行表連接的時(shí)候,最好不要超過三個(gè)表,因?yàn)樾枰?join 的字段,數(shù)據(jù)類型必須一致
能使用 limit 的時(shí)候盡量使用 limit
單表索引盡量控制在5個(gè)以內(nèi)
單索引字段數(shù)不允許超過5個(gè)(組合索引)
創(chuàng)建索引的時(shí)候應(yīng)該避免以下錯(cuò)誤概念
- 索引越多越好
- 過早優(yōu)化,在不了解系統(tǒng)的情況下進(jìn)行優(yōu)化