SQL優化
做了很多年有關數據庫的開發工作,現在把我對sql優化的一些經驗分享下。(由于我主要使用mysql,對其它結構化數據庫不太熟悉,所以可能具有片面性,歡迎拍磚)
sql優化的方面:
1、設計好的數據庫結構
2、分表與分區
3、創建正確的索引
4、減少訪問的次數
5、減少不必要的返回數據
6、書寫高效的sql
1、設計好的數據庫結構
好的數據庫結構不同的業務有不同的看法,這里主要說一條,好的數據庫設計應高保留重構的可能性。
2、分表與分區
(1)、分表
分表就是將一張大表分成多張小表。
分表的作用是提高數據庫的讀寫性能。
(2)、分區
分區是將一張表分成多個區塊。多個區塊可以在不同磁盤上。
分區的作用是提高磁盤的讀寫性能。
3、創建正確的索引
要創建正確的索引,有幾點是值得注意的:
(1)、根據業務中調用頻繁的sql的where語句建立索引。
(2)、索引的列的大小會對影響性能
(3)、聯合索引中索引列的順序是很關鍵的
(4)、索引并不是越多越好
4、減少訪問的次數
如果你需要對1000條數據進行處理,可能的情況下當然是一次取出來再處理,而不是取一條處理一條。減少了訪問次數也就減少了磁盤I/O,在很多應用里面,磁盤I/O都是性能的瓶頸。
5、減少不必要的返回數據
減少不必要的返回數據既指返回數據的條數,也指返回的數據字段。減少不必要的返回數據也就減少了網絡傳輸時間和磁盤I/O。
6、書寫高效的sql
(1)、盡量不要使用IS NULL或者IS NOT NULL
因為索引是不索引空的,因此他們將不使用索引。
(2)、盡量不要使用NOT
NOT也是不能使用索引的。
(3)、用EXISTS替代IN、用NOT EXISTS替代NOT IN
IN 是把外表和內表作hash連接,而EXISTS是對外表作loop循環,每次loop循環再對內表進行查詢。因此使用EXISTS的時候不要忘了在子查詢中加上外表字段與子表字段的聯合條件,否則效率同樣會很低。IN與EXISTS同樣與兩張表的數據量有一定的關系。
NOT EXISTS使用全表掃描,效率很低。
(4)、LIKE操作符
盡量不要使用'%www'的這種通配符前置的查詢,因為不會使用索引。
(5)、用UNION ALL 替代 UNION
UNION需要排序刪除重復,UNION ALL僅僅合并。
(6)、盡量少用OR
(7)、WHERE后面條件的順序
前面的條件盡量減少數據,還有順序也與索引有關。雖然新的數據庫引擎會做一些優化,但是同樣可以減少引擎優化的時間。