主頁 > 知識庫 > MySQL性能優(yōu)化技巧分享

MySQL性能優(yōu)化技巧分享

熱門標(biāo)簽:鐵路電話系統(tǒng) 網(wǎng)站排名優(yōu)化 百度競價排名 地方門戶網(wǎng)站 服務(wù)外包 呼叫中心市場需求 AI電銷 Linux服務(wù)器

MySQL性能優(yōu)化

在互聯(lián)網(wǎng)公司MySQL的使用非常廣泛,大家經(jīng)常會有MySQL性能優(yōu)化方面的需求。整理了一些在MySQL優(yōu)化方面的實用技巧。

Schema與數(shù)據(jù)類型優(yōu)化

  1. 整數(shù)通常是標(biāo)識列最好的選擇,因為它們很快并且可以使用AUTO_INCREMENT
  2. 完全“隨機(jī)”的字符串(如:MD5()、SHA1()或者UUID()等產(chǎn)生的字符串)會任意分布在很大的空間內(nèi),會導(dǎo)致INSERT以及一些SELECT語句變的很慢
  3. 如果希望查詢執(zhí)行得快速且并發(fā)性好,單個查詢最好不要做太多的關(guān)聯(lián)查詢(互聯(lián)網(wǎng)公司非常忌諱關(guān)聯(lián)查詢),利用程序來完成關(guān)聯(lián)操作
  4. 如果需要對一張比較大的表做表結(jié)構(gòu)變更(ALTER TABLE操作增加一列),建議先拷貝一張與原表結(jié)構(gòu)一樣的表,再將數(shù)據(jù)復(fù)制進(jìn)去,最后通過重命名將新表的表名稱修改為原表的表名稱。因為在變更表結(jié)構(gòu)的時候很有可能會鎖住整個表,并且可能會有長時間的不可用
  5. 避免多表關(guān)聯(lián)的時候可以適當(dāng)考慮一些反范式的建表方案,增加一些冗余字段

InnoDB索引優(yōu)化

  1. 如果不是按照索引的最左列開始查找,則無法使用索引
  2. 所有的非聚簇索引都需要先通過索引定位到對應(yīng)的主鍵,然后在到聚簇索引查找數(shù)據(jù),所以在定義主鍵索引的時候一定要謹(jǐn)慎
  3. 只有當(dāng)索引的列順序和ORDER BY子句的順序完全一致,并且所有列的排序方向(倒序或者正序)都一樣時,MySQL才能夠使用索引來對結(jié)果做排序。有一種情況下ORDER BY子句可以不滿足索引的最左前綴的要求,就是前導(dǎo)列為常量的時候。
  4. 在使用like來匹配字符串類型的字段的值時,盡可能的使用前綴匹配like ‘XX%',避免使用 like ‘%XX'
  5. 哈希索引是基于哈希表實現(xiàn)的,只有精確匹配索引所有列的查詢才有效,也不遵循索引的最左匹配原則
  6. 當(dāng)服務(wù)器需要對多個索引做聯(lián)合操作時(通常有多個OR條件),建議修改成UNION的方式,這樣方便命中索引
  7. 對于如何選擇索引的列順序有一個經(jīng)驗法則:將選擇性最高的列放到索引最前列
  8. 盡可能多的使用覆蓋索引(如果一個索引包含或者說覆蓋所有需要查詢的字段的值,我們就稱之為覆蓋索引),通過EXPLAINExtra列可以看到“Using index”信息
  9. 當(dāng)ID為主鍵時,創(chuàng)建索引(A),相當(dāng)于創(chuàng)建了(A)和(A, ID)兩個索引
  10. 表中的索引越多對SELECTUPDATEDELETE操作速度變慢,同時占用的內(nèi)存也會比較多
  11. InnoDB在二級索引上使用共享鎖,但是訪問主鍵索引需要排他鎖
  12. 盡可能的使用WHERE INWHERE BETWEEN AND的方式來進(jìn)行范圍查詢
  13. LIMIT的偏移量越大性能越慢
  14. 編寫查詢語句時應(yīng)該避免單行查找、盡可能的使用數(shù)據(jù)原生順序從而避免額外的排序操作,并盡可能使用索引覆蓋查詢

查詢性能優(yōu)化

1.對于低效的查詢,通常從兩個方面來分析:

  1. 確認(rèn)應(yīng)用程序是否在檢索大量超過需要的數(shù)據(jù)。這通常意味著訪問了太多的行,但有時候可能是訪問了太多的列
  2. 確認(rèn)MySQL服務(wù)器層是否在分析大量超過需要的數(shù)據(jù)行

2.一般MySQL能夠使用以下三種方式應(yīng)用WHERE條件,從好到壞依次為:

  • 在索引中使用WHERE條件倆過濾不匹配的記錄
  • 使用索引覆蓋掃描來返回記錄
  • 從數(shù)據(jù)表中返回數(shù)據(jù),然后過濾不滿足條件的記錄

3.MySQL從設(shè)計上讓連接和斷開連接都很輕量級,在返回一個小的查詢結(jié)果方面很高效。在一個通用服務(wù)器上,也能夠運行每秒超過10萬的查詢,一個千兆網(wǎng)卡也能輕松滿足每秒超過2000次的查詢,MySQL內(nèi)部每秒能夠掃描內(nèi)存中上百萬行數(shù)據(jù)

4.在刪除大量數(shù)據(jù)時,建議每次刪除一小批量數(shù)據(jù)后,暫停一會兒再做下一次的刪除

5.無論如何排序都是一個成本很高的操作,所以從性能角度考慮,應(yīng)盡可能避免排序或者盡可能避免對大量數(shù)據(jù)進(jìn)行排序

6.COUNT()函數(shù)有兩種不同的作用:它可以統(tǒng)計某個列值的數(shù)量,也可以統(tǒng)計行數(shù)。最簡單的就是通過COUNT(*)來統(tǒng)計行數(shù)

7.關(guān)聯(lián)查詢的時候要確保關(guān)聯(lián)的字段上有索引

8.在數(shù)據(jù)量很大并且歷史數(shù)據(jù)需要定期刪除的情況下,可以考慮使用分區(qū)表

9.如果定了的索引列和分區(qū)列不匹配,會導(dǎo)致查詢無法進(jìn)行分區(qū)過濾

10.外鍵約束盡可能避免,通常通過程序來實現(xiàn),心中要有外鍵

11.觸發(fā)器、存儲過程、自定義函數(shù)等最好不要使用

12.盡可能的利用查詢緩存,如果在寫查詢語句的時候有一些不確定的數(shù)據(jù)(NOW()或者CURRENT_DATE()等)時,則不會被緩存

13.用多個小表代替一個大表對查詢緩存有好處

14.批量寫入時只需要做一次緩存失效,所以相比單條寫入(每寫入一次,緩存就失效)效率更好,對于寫密集型的應(yīng)用,直接禁用查詢緩存

15.如果緩存的空間太大,在過期操作的時候可能會導(dǎo)致服務(wù)器僵死

以上是個人在工作中的經(jīng)驗總結(jié),如果有描述錯誤的地方希望大家可以幫忙指出,一起交流學(xué)習(xí)!

到此這篇關(guān)于MySQL性能優(yōu)化技巧分享的文章就介紹到這了,更多相關(guān)MySQL性能優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • MySQL 如何分析查詢性能
  • MySQL創(chuàng)建高性能索引的全步驟
  • MySQL性能壓力基準(zhǔn)測試工具sysbench的使用簡介
  • Mysql性能優(yōu)化之索引下推
  • MySQL性能突然下降的原因
  • Mysql索引性能優(yōu)化問題解決方案
  • MySQL20個高性能架構(gòu)設(shè)計原則(值得收藏)
  • Mysql高性能優(yōu)化技能總結(jié)
  • 詳解GaussDB for MySQL性能優(yōu)化

標(biāo)簽:銅川 湘潭 仙桃 湖南 蘭州 黃山 崇左 衡水

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《MySQL性能優(yōu)化技巧分享》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266