SQL優化的一點點建議
我們知道,不管是哪種資料庫,或者是哪種資料庫引擎,在對一條SQL語句進行執行的過程中都會做很多相關的優化,對於查詢語句,最重要的優化方式就是使用索引。
- 每個子查詢的查詢型別,一些常見的查詢型別。
id select_type description
1 SIMPLE 不包含任何子查詢或union等查詢
2 PRIMARY 包含子查詢最外層查詢就顯示為 PRIMARY
3 SUBQUERY 在select或 where字句中包含的查詢
4 DERIVED from字句中包含的查詢
5 UNION 出現在union後的查詢語句中
6 UNION RESULT 從UNION中獲取結果集
table
如果查詢使用了別名,那麼這裡顯示的是別名,如果不涉及對資料表的操作,那麼這顯示為null,如果顯示為尖括號括起來的就表示這個是臨時表,後邊的N就是執行計劃中的id,表示結果來自於這個查詢產生。如果是尖括號括起來的< union M,N >,與< derived N >類似,也是一個臨時表,表示這個結果來自於union查詢的id為M,N的結果集。
type
訪問型別
ALL 掃描全表資料
index 遍歷索引
range 索引範圍查詢
index_subquery 在子查詢中使用 ref
unique_subquery 在子查詢中使用 eq_ref
ref_or_null 對Null進行索引的優化的 ref
fulltext 使用全文索引
ref 使用非唯一索引查詢資料
eq_ref 在join查詢中使用PRIMARY KEYorUNIQUE NOT NULL索引關聯。
const 使用主鍵或者唯一索引,且匹配的結果只有一條記錄。
system const 連線型別的特例,查詢的表為系統表。
extra
extra的資訊非常豐富,常見的有:
Using index 使用覆蓋索引
Using where 使用了用where子句來過濾結果集
Using filesort 使用檔案排序,使用非索引列進行排序時出現,非常消耗效能,儘量優化。
Using temporary 使用了臨時表。
一些SQL優化建議
1.SQL語句不要寫的太複雜。
一個SQL語句要儘量簡單,不要巢狀太多層。
2.使用『臨時表』快取中間結果。
簡化SQL語句的重要方法就是採用臨時表暫存中間結果,這樣可以避免程式中多次掃描主表,也大大減少了阻塞,提高了併發效能。
3.使用like的時候要注意是否會導致全表掃
有的時候會需要進行一些模糊查詢比如
select id from table where username like ‘%hollis%’
關鍵詞%hollis%,由於hollis前面用到了“%”,因此該查詢會使用全表掃描,除非必要,否則不要在關鍵詞前加%,
4.儘量避免使用!=或<>操作符
在where語句中使用!=或<>,引擎將放棄使用索引而進行全表掃描。
可以使用
select id from t where num=10
union all
select id from t where num=20
替代
select id from t where num=10 or num=20
6.儘量避免使用in和not in
在 where 子句中使用 in和not in,引擎將放棄使用索引而進行全表掃描。
可以使用
select id from t where num between 10 and 20
替代
select id from t where num in (10,20)
7.可以考慮強制查詢使用索引
select * from table force index(PRI) limit 2;(強制使用主鍵)
select * from table force index(hollis_index) limit 2;(強制使用索引"hollis_index")
select * from table force index(PRI,hollis_index) limit 2;(強制使用索引"PRI和hollis_index")
8、儘量避免使用表示式、函式等操作作為查詢條件
9、儘量避免大事務操作,提高系統併發能力。
10、儘量避免使用遊標
11、任何地方都不要使用 select * from t ,用具體的欄位列表代替“*”,不要返回用不到的任何欄位。
12、儘可能的使用 varchar/nvarchar 代替 char/nchar
13、儘量使用數字型欄位,若只含數值資訊的欄位儘量不要設計為字元型,這會降低查詢和連線的效能,並會增加儲存開銷。
14、索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率
15、並不是所有索引對查詢都有效,SQL是根據表中資料來進行查詢優化的,當索引列有大量資料重複時,SQL查詢可能不會去利用索引