Mysql的查詢優化

2021-09-11 17:04:30 字數 2344 閱讀 5248

先要做好設計,再進行調優:

字段值中的null值會導致索引失效。

模糊匹配百分號前置,會導致索引失效,譬如like 「%aa」。

負向查詢會導致索引失效,譬如<>、!= 、not in 、not exist。

內建函式或表示式會導致索引無效,譬如where score-10 > 60、where abs(x) > 10。

強制轉換資料型別會導致索引無效,譬如where userid=34987576。

復合索引中的第乙個字段沒有出現在條件語句中,會導致索引無效。

join的字段的資料型別不一致,會導致索引無效。

避免使用select *,select count(*)。

避免limit 偏移量(offset)過大,減少檢索量。

關聯的表個數不宜多,過多可能會出現記憶體溢位,影響資料庫效能。

用inner join替換left join,因為inner join比left join效率高。

用union all替換union,因為union 會去重和排序,效率低。

避免子查詢:通常子查詢結果集會被儲存在臨時表裡中,無法使用索引,用join替換子查詢。

使用索引,如果不能使用索引,資料庫會建立臨時表用於排序。

垂直切分,將長欄位,如text、blog,拆分到單獨的表儲存。

避免去重,能不去重,就別用distinct;能用union all,就別用union。

不用or:or大多數情況下很少能利用上索引,in能更有效地利用索引。

in個數:in包含的值不宜過多,建議少於500個。

預編譯:預編譯可提高效能,而且可以防止sql注入。

冗餘:冗餘資料可以讓查詢執行更快,避免表關聯。

快取表:利用快取表儲存查詢結果,提公升查詢效率。

拆大變小:將複雜的sql拆分成小的sql並行執行,效率更高。

type:訪問型別,結果值從好到壞依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > all,一般來說,至少達到range級別,最好能達到ref。

key:實際使用的索引,如果為null,則沒有使用索引。很少的情況下,mysql會選擇優化不足的索引。這種情況下,可以在select語句中使用use index(indexname)來強制使用乙個索引或者用ignore index(indexname)來強制mysql忽略索引。

ref:顯示索引的哪一列被使用了。

extra:額外資訊,壞的例子是using temporary和using filesort,意思mysql根本不能使用索引。

參考:

-s 按照那種方式排序  c:訪問計數  t:查詢時間  l:鎖定時間  r:返回記錄  al:平均鎖定時間  ar:平均訪問記錄數  at:平均查詢時間

-t 是top n的意思,返回多少條資料。

-g 可以跟上正則匹配模式,大小寫不敏感。

mysqldumpslow -s c -t 20 host-slow.log   訪問次數最多的20個sql

mysqldumpslow -s r -t 20 host-slow.log   返回記錄集最多的20個sql

mysqldumpslow -t 10 -s t -g 「left join」 host-slow.log  返回照查詢時間最長且含有左連線前10個sql

profile可以對每一條sql的效能進行分析,但mysql5.7之後將被廢棄,推薦使用performance schema。

是否開啟: show variables like '%profiling%';  或  select @@profiling;

開啟: set profiling=1;

分析:show profiles; 

show profile for query 2; 

show profile cpu,block io,memory,swaps for query 2;

grep -e 'select' 201905_slow.log | awk -f 'from|where' '' | awk '!a[$0]++' > 201905_table.txt    慢查詢表名列表

grep 'wx_user' 201905_slow.log | wc -l    某錶的慢查詢次數

grep -b 2 'wx_user' 201905_slow.log | grep -e '# query_time:' | awk -f ' ' '' | awk ' end '  某錶的慢查詢總時長

查詢優化(MySQL優化查詢)

關聯查詢太多join 設計缺陷或不得已的需求 資料庫伺服器調優及各個引數設定不適當 緩衝 執行緒數等 慢查詢日誌 找出執行速度慢的sql語句 慢查詢的開啟並捕獲 explain 慢sql分析 show profile查詢sql在mysql伺服器裡面的執行細節和生命週期情況 sql資料庫伺服器的引數調...

mysql統計查詢優化 Mysql查詢優化

效能涉及的層面很多,但是在操作層面,主要有表結構設計優化 索引優化和查詢優化 查詢的生命週期大致可以分為,從客戶端 到服務端 在伺服器上解析 生成執行計畫 執行 返回結果給客戶端 sql執行流程 具體優化技巧 1.消除外連線 2.消除子查詢 盡量用join代替子查詢,雖說mysql查詢優化器會進行優...

MySQL優化 查詢優化

在每乙個消耗大量時間的查詢中,都能看到一些不必要的額外操作 某些操作被額外地重複了很多次 某些操作執行得太慢等。優化查詢的目的就是減少和消除這些操作所花費的時間。查詢效能低下最基本的原因是訪問的資料太多。所以需要考慮是否向資料庫請求了不需要的資料 1 多表關聯時,或獲取單錶資料時,盡量避免不加思考地...