近來面試找工作經常會遇見這種問題: 做過數據庫優化嗎?大數據量基礎過嗎?系統反應慢怎么查詢?
這咱也沒背過啊,面試還老問,現在的網站主要的壓力都來自於數據庫,頻繁的數據庫訪問經常會使系統癱瘓,這樣就需要進行sql優化。明天去58面試,今天來梳理一下。
1. 寫明查詢具體某幾列,減少*的使用,表名過長時,盡量使用表的別名
*和列名一樣
2,在業務密集的SQL當中盡量不采用IN操作符,用EXISTS 方案代替。
in 和 exists的區別: 如果子查詢得出的結果集記錄較少,主查詢中的表較大且又有索引時應該用in, 反之如果外層的主查詢記錄較少,子查詢中的表大,又有索引時使用exists。其實我們區分in和exists主要是造成了驅動順序的改變(這是性能變化的關鍵),如果是exists,那么以外層表為驅動表,先被訪問,如果是IN,那么先執行子查詢,所以我們會以驅動表的快速返回為目標,那么就會考慮到索引及結果集的關系了 ,另外IN時不對NULL進行處理。
in 是把外表和內表作hash 連接,而exists是對外表作loop循環,每次loop循環再對內表進行查詢。一直以來認為exists比in效率高的說法是不准確的。
3、模糊查詢like,盡量少用%
關鍵詞%yue%,由於yue前面用到了“%”,因此該查詢必然走全表掃描,除非必要,否則不要在關鍵詞前加%,
4, 二者都能使用盡量使用where (與having比較)
where 先過濾(數據就少了)再分組
5,盡量使用多表連接(join)查詢(避免子查詢)
子查詢效率特別低,而一般的子查詢都可以由關連查詢來實現相同的功能,關聯查詢的效率要提高很多,所以建議在數據查詢時避免使用子查詢(尤其是在記錄很多時),而最好用關聯查詢來實現。
6,建立索引
較頻繁地作為查詢條件的字段,唯一性不太差的字段適合建立索引,更新不太頻繁地字段適合創建索引,不會出現在where條件中的字段不該建立索引
7,多使用內部函數提高SQL效率
例如多用concat連接,代替'||' 的符號連接
8,應盡量避免在 where 子句中使用 != 或 <> ,in 或 not in
最好不要給數據庫留NULL,盡可能的使用 NOT NULL填充數據庫 (不然會進行全表掃描,影響效率)
9,盡可能的使用 varchar/nvarchar 代替 char/nchar (節省字段存儲空間)