SQL慢查詢原因及優化
阿新 • • 發佈:2020-08-27
SQL慢查詢原因:
- 沒有索引或者沒有使用到索引
- I/O吞吐量小,形成了瓶頸效應
- 沒有建立計算列導致查詢不優化
- 記憶體不足
- 網路速度慢
- 查詢出的資料量過大(可以採用多次查詢,其他的方法降低資料量)
- 鎖或者死鎖
- sp_lock,sp_who,活動的使用者檢視,原因是讀寫競爭資源
- 返回了不必要的行和列(這裡其實也和索引有關,如果不必要的行和列,沒有用到索引造成了全表掃描,或者是這些行和列佔用了鎖,才會拖慢)
- 查詢語句不好,沒有優化
SQL語句優化:
- 儘量避免全表掃描,首先考慮在where和order by涉及的列上建立索引
- 儘量避免在where子句中對欄位進行null值判斷,會導致引擎放棄使用索引而進行全表掃描
- 儘量避免在where子句中使用!= 或 <> 操作符,會導致引擎放棄使用索引而進行全表掃描
- 應儘量避免在 where 子句中使用 or 來連線條件,會導致引擎放棄使用索引而進行全表掃描
- 應儘量避免使用 in 和 not in,會導致全表掃描,能用between就不要用in
- 全模糊查詢也會導致全表掃描,可以考慮全文檢索
如: select id from t where name like '%c%';
- 在 where 子句中使用引數,也會導致全表掃描,可以改為強制使用索引
如: select id from t where num=@num ; 改為: select
- 儘量避免在 where 子句中對欄位進行表示式操作, 這將導致引擎放棄使用索引而進行全表掃描
如: select id from t where num/2=100; 可以改為: select id from t where num=100*2;
- 儘量避免在 where 子句中對欄位進行函式操作,這將導致引擎放棄使用索引而進行全表掃描
- 不要在 where 子句中的“=”左邊進行函式. 算術運算或其他表示式運算,否則系統將可能無法正確使用索引