Mysql查詢調優記錄

銘銘erom發表於2017-05-04

1、mysql會自己根據語句和資料的範圍決策出使用的索引,mysql會自己使用最合適的索引,where 後面的欄位順序無需與聯合索引一致。Mysql的查詢優化器會使用統計資料預估使用各個索引的代價(COST),與不使用索引的代價(COST)比較。Mysql會選擇代價最低的方式執行查詢。

2、能建立唯一索引儘量建立unique index,這樣能避免很多問題

3、不能建立類似於a_b和b_a兩個索引,可能會引起死迴圈,需要注意

4、如果有a_b的聯合索引,是不需要再單獨建立一個a的索引

5、寫程式碼的時候需要注意先explain sql語句,避免慢查詢,到了千萬級的資料時一個幾百ms的select也能拖垮整個資料庫,所以寫select的時候需要注意是否使用索引

6、mysql的limit offset,limit,在offset很大時,mysql是先把offset+limit資料查詢出,在取最後limit的資料,所以在進行寫翻頁sql時,需要注意深分頁的問題,能根據自增id偏移翻頁最好,如果不行的話,可以使用子查詢的方式,先把自增id查出來,再根據自增id查詢出你需要的欄位,避免在深分頁到最後取出太多的資料

7、儘量使用索引排序,如果沒有任何索引能達到你想要的排序效果,儘量控制排序的數量,避免大量的資料進行filesort,實在不行,將排序在程式碼裡進行排序,不要在大量的排序工作交給資料庫,因為會拖垮資料庫

8、儘量不要在mysql裡使用like來進行模糊查詢,首先mysql只有右模糊查詢支援走索引,另外mysql模糊查詢效率也比較低,可以通過elasticsearch來多條件模糊查詢

9、回表去查詢所需的資料意思就是你查詢的欄位光索引欄位不夠,需要根據索引查詢行資料,最後再提取出你需要的欄位

10、索引不是也多越好,索引多縱然提高了select的效率,但是同時降低了insert和update的效率,如果存在大量不同維度的查詢,建議改走elasticsearch

11、mysql裡資料型別的查詢效率比varchar效率高,所以儘量不要儲存字串到資料庫,列舉都轉化成對應的id儲存

12、程式碼裡強制不要用select *,第一降低了查詢效率,因為會返回大量無用的資料,第二也會因為增減表欄位導致程式碼異常

13、不要向客戶端返回過多的資料,資料傳輸可能就花費大量的時間,一般查過1000就分頁查詢

14、不要提交大事務,比如一次提交1000條update的事務。

15、mysql在物理硬體條件不考慮的情況下,單表能支援千萬級別的資料快速讀取,如果錶行數到了億級別,需要考慮是否有必要進行shading分庫分表。


相關文章