MySQL SQL 語句優化方法

2022-02-05 22:24:22 字數 1498 閱讀 7689

對查詢進行優化, 應盡量避免全表掃瞄, 首先應考慮在 where 及 order by 涉及的列上建立索引.

導致索引失效的操作:

應盡量避免在 where 子句中使用 != 或 <> 操作符, 否則將引擎放棄使用索引而進行全表掃瞄.

應盡量避免在 where 子句中對字段進行 null 值判斷, 否則將導致引擎放棄使用索引而進行全表掃瞄, 如:

select id from t where num is null

-- 可以在num上設定預設值0, 確保表中num列沒有null值, 然後這樣查詢:

select id from t where num=0

應盡量避免在 where 子句中使用 or 來連線條件, 否則將導致引擎放棄使用索引而進行全表掃瞄, 如:

select id from t where num=10 or num=20

-- 可以這樣查詢:

select id from t where num=10

union all

select id from t where num=20

盡量避免使用 左 like, 否則將導致引擎放棄使用索引而進行全表掃瞄.

應盡量避免在 where 子句中使用 in 和 not in, 否則會導致全表掃瞄, 如:

select id from t where num in(1,2,3)

-- 對於連續的數值, 能用 between 就不要用 in 了:

select id from t where num between 1 and 3

如果在 where 子句中使用引數, 也會導致全表掃瞄. 因為sql只有在執行時才會解析區域性變數, 但優化程式不能將訪問計畫的選擇推遲到執行時;

它必須在編譯時進行選擇. 然而, 如果在編譯時建立訪問計畫, 變數的值還是未知的, 因而無法作為索引選擇的輸入項. 如下面語句將進行全表掃瞄:

select id from t where num=@num

-- 可以改為強制查詢使用索引:

select id from t with(index(索引名)) where num=@num

應盡量避免在 where 子句中對字段進行表示式操作, 這將導致引擎放棄使用索引而進行全表掃瞄. 如:

select id from t where num/2=100

-- 應改為:

select id from t where num=100*2

在使用索引字段作為條件時, 如果該索引是復合索引, 那麼必須使用到該索引中的第乙個字段作為條件時才能保證系統使用該索引, 否則該索引將不會被使用.

避免資料型別的隱式轉換(例如:查詢的引數與字段型別不匹配), 隱式轉換會導致索引失效.

避免使用子查詢, 把子查詢優化為 join 操作. 子查詢的結果集無法使用索引; 子查詢會產生臨時表操作, 如果子查詢資料量大則嚴重影響效率.

在兩個結果集中明顯不會有重複值時使用 union all 而不是 union, 因為 union 會把所有資料放到臨時表中進行去重操作.

MySQL SQL語句優化

檢視表定義 show create table users 檢視表的索引 show index from users 你要獲取第乙個表的所有資訊,你說全表掃瞄快呢還是索引掃瞄快呢?所以當你查詢庫 包括left join中的臨時庫 的所有資訊時,資料庫會選擇最優方法 全表掃瞄!s表dept id na...

MySQL SQL語句優化explain關鍵字

explain select from score where cno 3 105 and degree select degree from score where sno 109 id select type table type possible keys keykey len refrows...

MySQL SQL語句和索引優化

索引優化 2.合理使用索引 慢查詢explain關鍵字 子查詢 select from customerinfo where customerid notin select customerid from salesinfo 連線查詢 select from customerinfo left jo...