轉載自:http://www.open-open.com/lib/view/open1349965222556.htmlhtml
作了不少年有關數據庫的開發工做,如今把我對sql優化的一些經驗分享下。(因爲我主要使用mysql,對其它結構化數據庫不太熟悉,因此可能具備片面性,歡迎拍磚)mysql
sql優化的方面:sql
一、設計好的數據庫結構數據庫
二、分表與分區網絡
三、建立正確的索引數據庫設計
四、減小訪問的次數oop
五、減小沒必要要的返回數據性能
六、書寫高效的sql優化
一、設計好的數據庫結構設計
好的數據庫結構不一樣的業務有不一樣的見解,這裏主要說一條,好的數據庫設計應高保留重構的可能性。
二、分表與分區
(1)、分表
分表就是將一張大表分紅多張小表。
分表的做用是提升數據庫的讀寫性能。
(2)、分區
分區是將一張表分紅多個區塊。多個區塊能夠在不一樣磁盤上。
分區的做用是提升磁盤的讀寫性能。
三、建立正確的索引
要建立正確的索引,有幾點是值得注意的:
(1)、根據業務中調用頻繁的sql的where語句創建索引。
(2)、索引的列的大小會對影響性能
(3)、聯合索引中索引列的順序是很關鍵的
(4)、索引並非越多越好
四、減小訪問的次數
若是你須要對1000條數據進行處理,可能的狀況下固然是一次取出來再處理,而不是取一條處理一條。減小了訪問次數也就減小了磁盤I/O,在不少應用裏面,磁盤I/O都是性能的瓶頸。
五、減小沒必要要的返回數據
減小沒必要要的返回數據既指返回數據的條數,也指返回的數據字段。減小沒必要要的返回數據也就減小了網絡傳輸時間和磁盤I/O。
六、書寫高效的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後面條件的順序
前面的條件儘可能減小數據,還有順序也與索引有關。雖然新的數據庫引擎會作一些優化,可是一樣能夠減小引擎優化的時間。