注意事項---數據庫

寫出高質量 SQL 的 30 條建議

https://mp.weixin.qq.com/s?__biz=Mzg2MjEwMjI1Mg==&mid=2247492603&idx=1&sn=6e9542e3d7154d442b81611cf3e64173&chksm=ce0e5478f979dd6e3fa4cb1f69ade3572a29b0bd568c8e2c76e99e4467fd0aad15d652603790&scene=90&xtrack=1&subscene=93&clicktime=1585481280&enterid=1585481280&ascene=56&devicetype=android-29&version=27000c37&nettype=ctnet&abtest_cookie=AAACAA%3D%3D&lang=zh_CN&exportkey=AaGEn9FlNPFG5Bqj6qIYd7Y%3D&pass_ticket=8V979z3VISKNxDl38oYCRcXbLVJz4DH56Z%2BpJOGNgWalmMGDIxF8hOVEaEGF2%2BuQ&wx_header=1

個人總結:

1.應儘量避免在where子句中使用or來連接條件,使用or可能會使索引失效,從而全表掃描。

正例:

//使用union all
select * from user where userid=1 
union all 
select * from user where age = 18

//或者分開兩條sql寫:
select * from user where userid=1
select * from user where age = 18


Union:對兩個結果集進行並集操作,不包括重複行,同時進行默認規則的排序;

Union All:對兩個結果集進行並集操作,包括重複行,不進行排序;

2.優化你的like語句,把%放前面,並不走索引,把% 放關鍵字後面,還是會走索引的。

正確使用:select userId,name from user where userId like '123%';

3.Inner join 、left join、right join,優先使用Inner join,如果是left join,左邊表結果儘量小

反例:

select * from tab1 t1 left join tab2 t2  on t1.size = t2.size where t1.id>2;

正例:

select * from (select * from tab1 where id >2) t1 left join tab2 t2 on t1.size = t2.size;
  • 如果inner join是等值連接,或許返回的行數比較少,所以性能相對會好一點。

  • 同理,使用了左連接,左邊表數據結果儘量小,條件儘量放到左邊處理,意味着返回的行數可能比較少。

4.不要有超過5個以上的表連接

  • 連表越多,編譯的時間和開銷也就越大。

  • 把連接表拆開成較小的幾個執行,可讀性更高。

  • 如果一定需要連接很多表才能得到數據,那麼意味着糟糕的設計了。

5.儘可能使用varchar/nvarchar 代替 char/nchar

反例:

  `deptName` char(100) DEFAULT NULL COMMENT '部門名稱'

正例:

  `deptName` varchar(100) DEFAULT NULL COMMENT '部門名稱'

理由:

  • 因爲首先變長字段存儲空間小,可以節省存儲空間。

  • 其次對於查詢來說,在一個相對較小的字段內搜索,效率更高。

 

 

 

 

 

 

 

 

 

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