寫出高質量 SQL 的 30 條建議
個人總結:
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 '部門名稱'
理由:
-
因爲首先變長字段存儲空間小,可以節省存儲空間。
-
其次對於查詢來說,在一個相對較小的字段內搜索,效率更高。