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 '%abc%'
模糊查詢如果是必要條件時,可以使用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優化?的詳細內容,更多請關注TW511.COM其它相關文章!