1 引言
隨著計算機應用技術的不斷普及和發展,數據庫系統正越來越多的走進人們的日常生活。在要求查詢結果正確無誤的同時,人們越來越關心查詢的效率問題。影響查詢效率的因素很多,諸如處理器的速度、I/O速度、存儲器的容量、操作系統、采取何種的數據庫服務系統等。但是對於特定服務器來說查詢的效率主要取決於DBA(數據庫管理員)所給定的查詢語句。
2 合理使用索引
數據庫服務器對數據進行訪問一般采用下面的兩種方式:①索引掃描,通過索引訪問數據;②表掃描,讀表中的所有頁。當對一個表進行查詢時,如果返回的行數占全表總行數的10%到15%時,使用索引可以極大的優化查詢的性能。但是如果查詢涉及到全表40%以上的行時,表掃描的效率比使用索引掃描的效率高。在具體使用的過程中,要結合實際的數據庫和用戶的需求來確定要不要索引以及在什麼字段上建立什麼樣的索引。下面給出一些通用的規則:
1. 在經常用作過濾器或者查詢頻率較高字段上建立索引;
2. 在SQL語句中經常進行GROUP BY、ORDER BY的字段上建立索引;
3. 在不同值較少的字段上不必要建立索引,如性別字段;
4. 對於經常存取的列避免建立索引;
5. 用於聯接的列(主健/外健)建立索引;
6. 在經常存取的多個列上建立復合索引,但要注意復合索引的建立順序要按照使用的頻度來確定。
2.1 聚集索引
聚集索引是指行的物理順序與行的索引順序相同的索引。一個表只能有一個聚集索引。非聚集索引是指定表的邏輯順序的索引,行的物理順序與索引順序不盡相同,每個表可以有多個非聚集索引。缺省情況下建立的是非聚集索引,但是在一些特定的情況下建立非聚集索引會極大的縮短查詢的時間。有大量重復值、且經常有范圍查詢(between,>,<,>=,<=)和orderby、groupby發生的列,可考慮建立聚集索引,而對於頻繁修改的列、或者返回小數目的不同值的這些情況應該避免建立聚集索引。
使用聚集索引的最大好處就是能夠根據查詢要求,迅速縮小查詢范圍,避免全表掃描。比如要返回2004年4月1日到2004年10月1日之間的數據,如果在日期的字段建立了聚集索引,那麼數據本來就是按照日期的順序排列的,只要找到開始和結尾日期的數據就可以了,可以極大的節省時間。而如果使用非聚集索引,必須查到這個時間段中每個日期對應的位置,然後在根據位置存取數據,明顯效率很低。顯而易見,使用聚集索引的優勢很明顯。一個表只能按照一個固定的順序來存儲數據,因此,在建立聚集索引的時候一定要和實際查詢相結合,看哪個字段對於查詢貢獻大,而且操作不是很頻繁。
索引有助於提高檢索性能,但過多或不當的索引也會導致系統低效。因為用戶在表中每添加一個索引,數據庫就要做更多的工作。過多的索引甚至會導致索引碎片。所以說,我們要合理使用索引體系,特別是對索引的創建,更應精益求精,使數據庫的性能得到更好的發揮。
3 書寫高效的SQL語句
雖然特定的數據庫服務器都會對輸入的查詢語句進行一定的優化操作,但是查詢效率主要取決於DBA所書寫的SQL語句的好壞。為確保編寫的SQL語句有較好的性能,應考慮以下的優化方法:
⑴盡量減少使用負邏輯的操作符和函數,因為它們會導致全表掃描,而且容易出錯。可以把含有NOT、<> 、!= 等負邏輯的條件表達式轉化為意思相當的正邏輯。
⑵字段提取要多少,取多少,避免使用“select *”格式,因為在數據量較大的時候,影響查詢性能的最大因素不在與數據的查找,而在於物理I/O的操作。
⑶避免使用LIKE、EXISTS、IN等標准表達式,他們會使字段上的索引無效,引起全表掃描。盡量減少表的聯接操作,不可避免的時候要適當增加一些冗余條件,使參與聯接的字段集盡量少。