SQL優化

jopen 12年前發布 | 33K 次閱讀 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后面條件的順序

                        前面的條件盡量減少數據,還有順序也與索引有關。雖然新的數據庫引擎會做一些優化,但是同樣可以減少引擎優化的時間。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!