1、對查詢進行優化,應儘量避免全表掃描,首先應考慮在where 及order by 涉及的列上建立索引。
2、應儘量避免在where 子句中使用!= 或<> 操作符,否則引擎放棄使用索引而進行全表掃描。
3、應儘量避免在where 子句中對字段進行 null值判斷。否則將導致引擎放棄使用索引而進行全表掃描,如:select * from t where num is null
可以在num上設置默認值0 ,確保表中num列沒有null值。然後這樣查詢
select num from t where t.num=0
4、應該儘量避免在where 子句中使用 or來連接條件,否則將導致引擎放棄索引而進行全表掃描,如:select num from t where num =10 or num=20
可以這樣查詢:
select num from t where num=10 union all select num from t where num= 20
注意:union 與union all 區別
其中 兩者的作用是把結果集查詢出來合併 然後返回一個結果集 。但是使用前提是兩表具有相同列數與 對應列數的數據類型相同。union 會對 合併結果集進行排序 篩選重複的元素 佔用CPU大 建議數據量大 不使用。反之 union all不會對其結果集進行排序 、篩選。直接返回。
5、這樣查詢也會導致全表查詢
select num from t where t.name like '%abc%'
若提高效率 則使用全文檢索。
6、 in 和not in要慎用,否則也會導致全表掃描,如:
select num from t where num in('1','2','3')
對於連續的數值 ,能用between 就不要用in
select num from t where num between 1 and 3
7、應儘量避免在where 子句中對字段 進行表達式操作,這也將會導致全表掃描。
select num from t where num/2=100
8、指定 列名查詢時 儘量將列名大寫,在我們數據庫中的解析器 解析時 會把SQL轉化成大寫。如果直接寫成大寫 就省去這一步,提高效率。
9、很多時候用exists 代替 in是一個好的選擇
select num from t where num in(select num from tt)
可以寫成;
select * from t where exists(select 1 from tt where num=t.num)
10、任何地方都不要使用 select * from t,用具體的字段列表代替 * ,不要返回用不到的字段。
11、索引並不是越多越好,索引固然可以提高相應的select 的效率,但同時也降低 了 insert 及update的效率,因爲insert 或 update 時 有可能會重建索引。一般 一張表中最好不超過 6個。
12、合理建立索引,一般在經常查詢的字段上建立索引 提高查詢速度。避免在像 “性別“字段建立 ,原因因爲這樣的字段 總只有兩個值‘男’ ‘女’
13、避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。