程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> 數據庫學習-索引設計准則

數據庫學習-索引設計准則

編輯:關於MYSQL數據庫

1. 一個表如果建有大量索引會影響INSERT、UPDATE和DELETE語句的性能,因為在表中的數據更改時,所有索引都須進行適當的調整。 避免對經常更新的表進行過多的索引,並且索引應保持較窄,就是說,列要盡可能少。

2. 使用多個索引可以提高更新少而數據量大的查詢的性能。大量索引可以提高不修改數據的查詢(例如SELECT語句)的性能,因為查詢優化器有更多的索引可供選擇,從而可以確定最快的訪問方法。

3. 對小表進行索引可能不會產生優化效果,因為查詢優化器在遍歷用於搜索數據的索引時,花費的時間可能比執行簡單的表掃描還長。因此,小表的索引可能從來不用,但仍必須在表中的數據更改時進行維護。

4. 視圖包含聚合、表聯接或聚合和聯接的組合時,視圖的索引可以顯著地提升性能。若要使查詢優化器使用視圖,並不一定非要在查詢中顯式引用該視圖。

5. 為經常用於查詢中的謂詞和聯接條件的所有列創建非聚集索引。避免添加不必要的列。添加太多索引列可能對磁盤空間和索引維護性能產生負面影響。

6. 涵蓋索引可以提高查詢性能,因為符合查詢要求的全部數據都存在於索引本身中。也就是說,只需要索引頁,而不需要表的數據頁或聚集索引來檢索所需數據,因此,減少了總體磁盤I/O。例如,對某一表(其中對列a、列b和列c創建了組合索引)的列a和列b的查詢,僅僅從該索引本身就可以檢索指定數據。

7. 將批量insert、update的操作寫入單個語句內,而不要使用多個SQL語句操作相同的行。僅使用一個語句,就可以利用優化的索引維護。

8. 評估查詢類型以及如何在查詢中使用列。例如,在完全匹配查詢類型中使用的列就適合用於非聚集索引或聚集索引。

9. 對於聚集索引,請保持較短的索引鍵長度。另外,對唯一列或非空列創建聚集索引可以使聚集索引獲益。

10. 不能將ntext、text、image、varchar(max)、nvarchar(max) 和varbinary(max) 數據類型的列指定為索引鍵列。不過,varchar(max)、nvarchar(max)、varbinary(max) 和XML數據類型的列可以作為非鍵索引列參與非聚集索引。

11. xml數據類型的列只能在XML索引中用作鍵列。

12. 檢查列的唯一性。在同一個列組合的唯一索引而不是非唯一索引提供了有關使索引更有用的查詢優化器的附加信息。

13. 在列中檢查數據分布。通常情況下,為包含很少唯一值的列創建索引或在這樣的列上執行聯接將導致長時間運行的查詢。這是數據和查詢的基本問題,通常不識別這種情況就無法解決這類問題。例如,如果物理電話簿按姓的字母順序排序,而城市裡所有人的姓都是Smith或Jones,則無法快速找到某個人。

14. 如果索引包含多個列,則應考慮列的順序。用於等於 (=)、大於 (>)、小於 (<) 或BETWEEN搜索條件的WHERE子句或者參與聯接的列應該放在最前面。其他列應該基於其非重復級別進行排序,就是說,從最不重復的列到最重復的列。

例如,如果將索引定義為LastName、FirstName,則該索引在搜索條件為WHERE LastName = ‘Smith’ 或WHERE LastName = Smith AND FirstName LIKE ‘J%’ 時將很有用。不過,查詢優化器不會將此索引用於基於FirstName (WHERE FirstName = ‘Jane’) 而搜索的查詢。

15. 考慮對計算列進行索引。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved