必須掌握的13種SQL語句優化

​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、避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章