SQL優化

轉載自: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後面條件的順序

                        前面的條件儘可能減小數據,還有順序也與索引有關。雖然新的數據庫引擎會作一些優化,可是一樣能夠減小引擎優化的時間。

相關文章
相關標籤/搜索