WEB后端開發(fā)人員對MySQL優(yōu)化步驟

WEB后端開發(fā)人員對MySQL優(yōu)化步驟

庫表結(jié)構(gòu)優(yōu)化

  1. 選擇合適的更小的數(shù)據(jù)類型,因為他們占用更少的磁盤、內(nèi)存
  2. 盡量避免NULL,當(dāng)檢索該行時有可能不走索引
  3. 單表不要使用過多的字段,避免大量產(chǎn)生大量死字段
  4. 盡量使用相同數(shù)據(jù)類型存儲相似或相關(guān)的值,尤其是要在關(guān)聯(lián)條件中使用的列
  5. 范式和反范式并存

索引優(yōu)化

沒有用到索引我們需要遍歷雙向鏈表來定位對應(yīng)的頁,有了索引之后,我們通過底層數(shù)據(jù)結(jié)構(gòu)為B+樹的目錄進行二分查找,時間復(fù)雜度有O(n)變?yōu)榱薕(logn),索引雖然能提高查詢速度,同時卻會降低更新表的速度,并且也要占用空間。

創(chuàng)建索引

  • 頻繁作為查詢條件的字段應(yīng)該創(chuàng)建索引
  • 查詢中與其他表關(guān)聯(lián)的字段
  • 單鍵、組合索引的選擇問題,組合索引性價比更高
  • 查詢中那個排序的字段,排序字段若通過索引去訪問將大大提高排序速度
  • 查詢中統(tǒng)計或分組的字段

索引失效情況

  • like以%開頭,索引無效;當(dāng)like前綴沒有%,后綴有%時,索引有效
  • or使索引失效,數(shù)據(jù)庫引擎會根據(jù)數(shù)據(jù)規(guī)模,左右是否使用索引,是否有主鍵產(chǎn)生不同的現(xiàn)象,考慮使用union優(yōu)化
  • 組合索引時,最左前綴規(guī)則
  • 數(shù)據(jù)類型出現(xiàn)隱式轉(zhuǎn)換,如varchar不加單引號的話可能會自動轉(zhuǎn)換為int型,使索引無效,產(chǎn)生全表掃描。
  • IS NULL和IS NOT NULL根據(jù)命中率不同,走不走索引的情況也不同
  • 在索引字段上使用not,<>,!=不會走索引
  • 對索引字段進行計算操作,字段上使用函數(shù)不會走索引
  • 當(dāng)全表掃描速度大于索引速度時,會走全表

查詢優(yōu)化

查詢性能低下最基本的原因就是數(shù)據(jù)訪問太多,從兩個方面著手。

  • 確認應(yīng)用程序是否檢索大量超過需要的數(shù)據(jù),太多的行或列
  • 確認服務(wù)器層是否在分析大量超過需要的數(shù)據(jù)行。

優(yōu)化手段

  • SELECT后面緊跟需要的字段,避免使用*
  • 使用LIMIT限制返回條數(shù)
  • 將大查詢分解多個小查詢,緩存效率更高,減少鎖的競爭,更高的擴展
  • 使用IN取代OR
  • 優(yōu)化關(guān)聯(lián)查詢,多表篩選時,可以先將數(shù)據(jù)篩選出來再來關(guān)聯(lián)其他表,為關(guān)聯(lián)字段創(chuàng)建索引
  • 排序優(yōu)化,盡量使用索引排序,如果不能走索引,mysql自己會排序,當(dāng)數(shù)據(jù)量小于排序緩沖區(qū)的大小時,mysql使用內(nèi)存進行排序,速度極快;但當(dāng)數(shù)據(jù)量很大時,mysql走文件排序,就會消耗很多資源,并且耗時也長。
  • 盡量使用關(guān)聯(lián)查詢替代子查詢
  • OFFSET優(yōu)化

橫向擴展

集群、負載均衡、主從、讀寫分離

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

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