如何設計索引

2021-09-01 17:37:32 字數 2251 閱讀 1696

有人說乙個表的索引不能超過6個,這是不對的。衡量索引是否合理不能單純的用乙個數字來判斷。在

一張表上建立多少索引,建立什麼樣的索引,並無一定的規律。不能說一張表上有6個索引,就不能再建立第

7個索引了。設計索引時應該從應用的角度出發,

一切服從應用需要。

大家都知道索引會增加維護的成本,影響dml語句的效能,但在一般的oltp系統中,和dml操作相

比,select操作所佔的比例要少的多。如果少乙個索引,可能導致某張大表經常進行全表掃瞄,增加的

cpu和i/o開銷可能達到這個索引維護成本的上百倍。所以不能單獨的憑乙個數字來判斷索引是否合理。

分析索引是否合理,需要將sql都找出來,按照 buffer get或者physical read 排序,分析排在前面對性

能影響較大的sql,看where 條件和連線條件,然後判斷如何建立索引。

設計索引時要統籌考慮

在設計時,必須為執行最為頻繁,對系統效能影響較大的sql設計成本開銷最小的索引,而一些次要的

sql,可以和其他sql共用索引(建立復合索引來共用),這些索引可能並不是最優的,但能滿足目前應用

的需求。

要記住,最優的並不是最好

的,最適合的才是最好的。

盡可能的讓乙個索引為更多的sql服務,設計合理的復合索引是十分關鍵的。

適當的時候需要建立符合索引

有這樣乙個sql:

select * from table where  a > *** and b > ***

在a列上有乙個索引,但該sql在執行時發現通過a的索引篩選出來的有4000條資料,然後通過篩選出

最後的結果是10條。既然建乙個復合索引(a+b),可以減少400倍的資料讀取,為什麼不呢?

合併類似索引

比如乙個表上有a + b和 a+c  兩個索引,設計乙個a+b+c索引也許是不錯的選擇。

比如有a + b+c和 a+c +b兩個索引,設計乙個a+b+c索引或者a+c +b索引即可,至於設計成 a+b+c

還是a+c +b取決於是a + b用的多,還是a+c作為篩選條件時用的多。

比如a+ c+e和a+b+e => 可以設計成a+ c+b+e或其他的,

要注意的是,具體字段順序,要根據應用情

況取捨。

盡可能將復合索引中選擇性強的字段放前面,這樣可以減少索引範圍掃瞄成本。

根據實際情況選擇索引類別

位圖索引和b樹索引的使用場合是不同的,位圖索引儲存的是字段值的點陣圖,當修改索引的字段的值

時,會鎖定和這個值相等的所有記錄。因此,一般來說,某張表如果針對索引列更新、刪除、插入比較頻

繁,是不適合使用位圖索引的,不然很容易出現死鎖。一般來說otlp中不適合使用位圖索引。但如果不出現

死鎖或鎖增加的情況,在otlp系統中使用位圖索引也是可以的。

要注意函式索引的使用

函式索引和普通索引的維護開銷是差不多的。如果系統中不可避免的在某列上使用函式,那麼請放心的

使用函式索引吧。

有時候在索引中增加部分額外的字段能起到很好的作用。 

例如:

select a from table where b=:1

對於這樣的sql,一般會建立b列的索引。但如果建立乙個a+b的索引,可以避免對錶的掃瞄。當然,

這裡不是說碰到這樣的情況就建立包含select中的列的索引,應該根據實際情況來設計。

盡信書不如無

書。使用索引時要注意的:

第一:索引必須是有用的。

不使用的索引會增加dml操作的成本,也可能導致錯誤的執行計畫。所以必須清除無用的索引,但要注

意的是,除非有很大的把握,否則不要輕易刪除索引。在刪除索引時,要確認沒有業務會使用到它。

第二,確保表和索引的統計資訊的一致性。

如果索引的統計資訊和表的統計資訊不一致,可能會出現錯誤的執行計畫。對索引分析後,需要對錶重

新分析。確保表和索引的統計資訊是一致的。

第三,不要在索引列上使用函式。

在索引列上使用函式,會導致索引失效。所以不要在索引列上使用函式。當然,如果確實要使用,可以

建立函式索引。

另外,避免索引列上使用隱式的強制轉換。比如,索引列a的字段型別為date。當和它比較的值是

timestamp型別時

where create_date > *** 

會將小型別向大型別轉換。這時create_date 會被隱式強轉成timestamp型別。變成

where to_ timestamp (create_date)> *** 

導致不能使用索引。

php 如何設計索引 關於索引設計的詳細介紹

今天乙個朋友向我諮詢怎麼去優化 mysql,我按著思維整理了一下,大概粗的可以分為21個方向。還有一些細節東西 table cache,表設計,索引設計,程式端快取之類的 先不列了,對乙個系統,初期能把下面做完也是乙個不錯的系統。1.要確保有足夠的記憶體 資料庫能夠高效的執行,最關建的因素需要記憶體...

mysql索引設計 MySQL索引設計原則

一 mysql常用的索引型別 1.1主鍵索引 primary key 1.2唯一索引 unique 1.3普通索引 index 1.4全文索引 1.5組合索引 二 mysql常用的資料結構 2.1b tree 2.2雜湊索引 三 索引的設計原則 3.1選擇唯一性索引 被設為唯一性的值可以設定為索引,...

索引 聚集索引設計指南

每個表只能有乙個聚集索引,因為資料行本身只能按乙個順序儲存.有關聚集索引體系結構的詳細資訊,請參閱 聚集索引結構.每個表幾乎都對列定義聚集索引來實現下列功能 uniqueifieruniqueifier 查詢注意事項 在建立聚集索引之前,應先了解資料是如何被訪問的.考慮對具有以下特點的查詢使用聚集索...