使用索引的注意事項(xiàng)

  1. 當(dāng)使用索引列進(jìn)行查詢的時(shí)候,盡量不要使用表達(dá)式,把計(jì)算放到業(yè)務(wù)層而不是數(shù)據(jù)庫(kù)層
select * from user where age + 1 = 2;
  1. 盡量使用主鍵查詢,而不是其他索引,減少回表查詢的觸發(fā)
自然主鍵、代理主鍵(與業(yè)務(wù)層面無關(guān),比如 id)
  1. 使用前綴索引

  2. 使用索引掃描來排序

explain …… /G
using filesort
  1. union all , in , or 都能使用索引,但推薦使用 in
如果是單列索引,or 會(huì)走索引的
如果是組合索引,所有列都必須包含(id 主鍵不算),or 才會(huì)走索引
  1. 范圍列可以用到索引
范圍條件是: >, >=, <, <=, between
范圍列可以用到索引,但范圍列后面的列無法使用到索引,索引最多用于一個(gè)范圍列
  1. 強(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……';
  1. 更新十分頻繁,數(shù)據(jù)區(qū)分度不高的字段上不宜建立索引
  • 更新會(huì)變更 B+樹,更新頻繁字段建立索引會(huì)大大降低數(shù)據(jù)庫(kù)性能
  • 類似性別這類區(qū)分不大的字段,建立索引是沒有意義的,不能有效過濾數(shù)據(jù)
  • 一般區(qū)分度在80%以上的時(shí)候就可以建立索引,區(qū)分度可以用 count(distinct(列名))/count(*)來計(jì)算
  1. 創(chuàng)建索引列,不允許為null,可能會(huì)得到不符合預(yù)期的結(jié)果

  2. 當(dāng)需要進(jìn)行表連接的時(shí)候,最好不要超過三個(gè)表,因?yàn)樾枰?join 的字段,數(shù)據(jù)類型必須一致

  3. 能使用 limit 的時(shí)候盡量使用 limit

  4. 單表索引盡量控制在5個(gè)以內(nèi)

  5. 單索引字段數(shù)不允許超過5個(gè)(組合索引)

  6. 創(chuàng)建索引的時(shí)候應(yīng)該避免以下錯(cuò)誤概念

  • 索引越多越好
  • 過早優(yōu)化,在不了解系統(tǒng)的情況下進(jìn)行優(yōu)化
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容