資料庫索引的原理非常簡單,但在複雜的表中真正能正確使用索引的人很少,即使是專業的dba 也不一定能完全做到最優。
索引會大大增加表記錄的dml(insert,update,delete) 開銷,正確的索引可以讓效能提公升100 ,1000 倍以上,不合理的索引也可能會讓效能下降100 倍,因此在乙個表中建立什麼樣的索引需要平衡各種業務需求。
索引有哪些種類?
常見的索引有b-tree 索引、位圖索引、全文索引,位圖索引一般用於資料倉儲應用,全文索引由於使用較少,這裡不深入介紹。b-tree 索引包括很多擴充套件型別,如組合索引、反向索引、函式索引等等,以下是b-tree 索引的簡單介紹:
b-tree 索引也稱為平衡樹索引(balance tree) ,它是一種按欄位排好序的樹形目錄結構,主要用於提公升查詢效能和唯一約束支援。b-tree 索引的內容包括根節點、分支節點、葉子節點。
葉子節點內容:索引字段內容+ 表記錄rowid
根節點,分支節點內容:當乙個資料塊中不能放下所有索引字段資料時,就會形成樹形的根節點或分支節點,根節點與分支節點儲存了索引樹的順序及各層級間的引用關係。
在什麼欄位上建索引?
建立必要的索引
總綱只有一句話:建立必要的索引,這就是後面內容基礎。這點看似容易實際卻很難。難就難在如何判斷哪些索引足必要的,哪些又是不必要的。判斷的最終標準是看這些索引是否對我們的資料庫效能有所幫助。具體到方法上,就必須熟悉資料庫應用程式巾的所有sql 語句,從中統計出常用的能對效能有影響的部分sql ,分析、歸納出作為where 條件子句的字段及其組合方式:在這一基礎上可以初步判斷出哪些表的哪些寧段應該建立索引。其次,必須熟悉應用程式。必須了解哪些表足資料操作頻繁的表:哪些表經常與其他表進行連線;哪些表的資料可能很大;對於資料是大的表,其巾各個欄位的資料分布情況如何;等等。對於滿足以上條件的這些表,必須重點關注,因為在這些表上的索引,將對sql 語句的效能產生舉足輕重的影響。建立索引常用的規則如下:
1 、表的主鍵、外來鍵必須有索引:
2 、資料最超過300 的表應該有索引:
3 、經常與其他表進行連線的表,在連線欄位上應該建立索引;
4 、經常出現在where 子句中的字段,特別是大表的字段,應該建立索引;
5 、索引應該建在選擇性高的字段上;通過字段條件可篩選的記錄集很小
6 、索引應該建在小字段上,對於大的文字字段甚至超長字段,不要建索引:
7 、復合索引的建立需要進行仔細分析:盡最考慮用單字段索引代替:
8 、頻繁進行資料操作的表,不要建立太多的索引
以下是一些字段是否需要建b-tree 索引的經驗分類:
1 、 需要建索引的字段
主鍵、外來鍵和有物件或身份表示意義的字段,如 code,username
2 、索引慎用字段, 需要進行資料分布及使用場景詳細評估
日期、年月、狀態標誌、型別、區域( 如country,province,city) 、操作人員( 如creator,auditor) 、數值( 如score) 、長字元( 如address)
3 、不適合建索引的字段
描述備註( 如: memo) 、大字段( 如:file_content)
索引對dml(insert,update,delete) 附加的開銷
這個沒有固定的比例,與每個表記錄的大小及索引字段大小密切相關,以下是乙個普通表測試資料,僅供參考:
索引對於insert 效能降低56%
索引對於update 效能降低47%
索引對於delete 效能降低29%
因此對於寫io 壓力比較大的系統,表的索引需要仔細評估必要性,另外索引也會占用一定的儲存空間。
如何合理地建立 Mysql 索引
前言 索引基礎知識 建立索引 alter table table name add index index name 刪除索引 alter table table name drop index index name 檢視表中的索引 show index from table name 如何優化sq...
合理設定索引
索引查詢是資料庫中重要的記錄查詢方法,要不要進入索引以及在那些欄位上建立索引都要和實際資料庫系統的查詢要求結合來考慮,下面給出實際中的一些通用的原則 1.在經常用作過濾器的字段上建立索引 2.在 sql語句中經常進行 group by order by 的字段上建立索引 3.在不同值較少的字段上不必...
合理使用索引
索引是資料庫中重要的資料結構,它的根本目的就是為了提高查詢效率。現在大多數的資料庫產品都採用ibm最先提出的isam索引結構。索引的使用要恰到好處,其使用原則如下 在經常進行連線,但是沒有指定為外來鍵的列上建立索引,而不經常連線的字段則由優化器自動生成索引。在頻繁進行排序或分組 即進行group b...