mysql 的基礎sql 優化

2021-09-27 02:17:17 字數 2168 閱讀 9325

避免全表掃瞄

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

避免判斷 null 值

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

selec tid from test where num is null

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

select id from test where num = 0

避免不等值判斷

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

避免使用 or 邏輯

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

select id from test where id= 1or id= 2

可以這樣查詢:

select id from test where id= 1 union all select id from test where id= 2

union all不再建立臨時表,這樣在聯合查詢時會減少i/o開銷

慎用 in 和 notin 邏輯

in 和 notin 也要慎用,否則會導致全表掃瞄,如:

select id from testa where id in ( selec tid from testb where id > 10)

此時外層查詢會全表掃瞄,不使用索引。可以修改為:

select id from testa ta,( select id from testb where id > 10 ) tb where ta.id = tb.id

注意模糊查詢

下面的查詢也將導致全表掃瞄:

select id from t where name like '%abc%'

模糊查詢如果是必要條件時,可以使用

select id from t where name like 'abc%'

來實現模糊查詢,此時索引將被使用。如果頭匹配是必要邏輯,建議使用全文搜尋引擎(elasticsearch、 lucene、solr 等)。

避免查詢條件中欄位計算

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

select id from t where num/2=100

應改為:

select id from t where num=100*2

避免查詢條件中對字段進行函式操作

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

select id from t where substring(name,1,3)='abc'--name

以 abc 開頭的 id 應改為:

select id from t where name like 'abc%'

where 子句「=」左邊注意點

不要在 where 子句中的「=」左邊進行函式、算術運算或其他表示式運算,否則系統 將可能無法正確使用索引。

組合索引使用

在使用索引字段作為條件時,如果該索引是復合索引,那麼必須使用到該索引中的第乙個字段作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應盡可能的讓字段順序與索引順序相一致。

exists

很多時候用 exists 代替 in 是乙個好的選擇:

select num from a where num in(select num from b)

用下面的語句替換:

select num from a where exists(select 1 from b where num=a.num)

MySQL優化 SQL優化

其實sql語句的優化核心就在避免全表掃瞄上面 對查詢語句優化,避免全表掃瞄 首先應考慮在where及order by涉及的列上建立索引 避免在where子句中對字段進行表示式和函式操作 避免where進行null 等運算導致的全表掃瞄 在group by後面增加order by null就可以防止g...

Mysql優化 SQL語句優化

索引優化 where 字段 組合索引 最左字首 索引下推 非選擇行 不加鎖 索引覆蓋 不回表 on兩邊 排序 分組 explain分析語句情況,看建立索引沒,或者建立錯誤,響應時間長的話可以看下慢查詢日誌 盡量不要用 查所有字段的話,select查詢列中的字段如果沒有索引的話,會造成回表 limit...

oracle基礎 SQL優化

一 軟解析和硬解析 1 解析過程 1 語法 語義分析 2 許可權和物件檢查 3 在共享池中進行檢測是否有已解析的相同sql,如果存在 則跳過4 5 執行軟解析,4 5成本比較高 所以要避免硬解析,繫結變數 4 選擇執行計畫 可能有多個執行計畫數 5 生成執行計畫 2 檢視解析結果 select ha...