天天看點

Mysql 查詢調優記錄

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分庫分表。