mysql進行sql優化的方法:1、避免全表掃描,在where及order by涉及的列上建立索引;2、在where子句中避免對字段進行null值判斷,避免使用“ !=”或“<>”操作符,避免使用or來連接條件;3、慎用in和not in。
MySQL中的SQL的常見最佳化策略
1 避免全表掃描
對查詢進行最佳化,應盡量避免全表掃描,首先應考慮在where 及order by 涉及的列上建立索引。
2 避免判斷null值
應盡量避免在where 子句中對欄位進行null 值判斷,否則將導致引擎放棄使用索引而進行全表掃描,如:
select id from t where num is null
可以在num上設定預設值0,確保表中num 列沒有null值,然後這樣查詢:
##
select id from t where num=0
#3 避免不等值判斷
應盡量避免在where 子句中使用!=或<>運算符,否則引擎將放棄使用索引而進行全表掃描。4 避免使用or邏輯#應盡量避免在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
5 慎用in和not in邏輯in 和not in 也要慎用,否則會導致全表掃描,如:
select id from t1 where num in(select id from t2 where id > ; 10)
此時外層查詢會全表掃描,不使用索引。可以修改為:
select id from t1,(select id from t1 where id > 10)t2 where t1.id = t2.id
此時索引被使用,可以明顯提升查詢效率。
6 注意模糊查詢下面的查詢也會導致全表掃描:
select id from t where name like '�c%'
模糊查詢如果是必要條件時,可以使用select id from t where name like 'abc%'來實作模糊查詢,此時索引將會被使用。如果頭匹配是必要邏輯,建議使用全文搜尋引擎(Elastic search、Lucene、Solr等)。
7 避免查詢條件中欄位計算#應盡量避免在where 子句中對欄位進行表達式運算,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where num/2=100
應改為:
select id from t where num=100*2
8 避免查詢條件中對欄位進行函數操作#應盡量避免在where子句中對欄位進行函數操作,這將導致引擎放棄使用索引而進行全表掃描。如:
select id from t where substring(name,1,3)='abc'--name以abc開頭的id
應改為:
select id from t where name like 'abc% '
9 WHERE子句「=」左邊注意點不要在where 子句中的「=」左邊進行函數、算術運算或其他表達式運算,否則系統將可能無法正確使用索引。
10 組合索引使用#在使用索引欄位作為條件時,如果該索引是複合索引,那麼必須使用到此索引中的第一個欄位作為條件時才能保證系統使用該索引,否則該索引將不會被使用,並且應盡可能的讓欄位順序與索引順序相符。
11 不要定義無異議的查詢#不要寫一些沒有意義的查詢,如需要產生一個空表結構:
select col1,col2 into #t from t where 1=0
這類程式碼不會傳回任何結果集,但是會消耗系統資源的,應改成這樣:
create table #t(. ..)
12 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)
13 索引也可能失效
並不是所有索引對查詢都有效,SQL是根據資料表中資料來進行查詢最佳化的,當索引列有大量資料重複時,SQL查詢可能不會去利用索引,如一表中有字段sex,male、female幾乎各一半,那麼即使在sex上建了索引也對查詢效率起不了作用。
14 表格字段類型選擇
#盡量使用數字型字段,若只含數值資訊的字段盡量不要設計為字符型,這會降低查詢和連接的效能,並會增加儲存開銷。這是因為引擎在處理查詢和連接時會逐個比較字串中每一個字符,而對於數字型而言只需要比較一次就夠了。
盡可能的使用 varchar 代替 char ,因為首先可變長度字段存儲空間小,可以節省存儲空間,其次對於查詢來說,在一個相對較小的字段內搜索效率顯然要高些。
15 查詢語法中的欄位
#任何地方都不要使用select * from t ,用具體的欄位清單取代“ *”,不要傳回用不到的任何欄位。
16 索引無關優化
#不使用*、盡量不使用union,union all等關鍵字、盡量不使用or關鍵字、盡量使用等值判斷。
表格連接建議不超過5個。如果超過5個,則考慮表格的設計。 (在互聯網應用中)
表連接方式使用外聯優於內聯。
外連線有基礎資料存在。如:A left join B,基礎數據是A。
A inner join B,沒有基礎資料的,先使用笛卡爾積完成全連接,在根據連接條件得到內連接結果集。
大資料量級的表格做分頁查詢時,如果頁碼數量過大,則使用子查詢來配合完成分頁邏輯。
Select * from table limit 1000000, 10
Select * from table where id in (select pk from table limit 100000, 10)
以上是mysql如何進行sql優化?的詳細內容。更多資訊請關注PHP中文網其他相關文章!