索引
索引是一種快速訪問資料的途徑,可提高資料庫效能。索引使資料庫程式無須對整個表進行掃描,就可以在其中找到所需的資料。通過建立索引能提高查詢的效能。
一般來說,select、update、delete命令的where子句效能會得到提高,但是insert(對標和索引都進行插入)、索引列update、大量資料的delete的效能會降低。
索引的分類
邏輯分類:單列索引、組合索引、唯一索引、非唯一索引,函式索引。
物理分類:區分索引、非分割槽索引、B樹索引、正向索引、反向索引,點陣圖索引。
索引的缺點:
1、索引佔用表空間,建立太多索引可能會造成索引冗餘。
2、索引會影響INSERT、UPDATE、DELETE語句的效能。
使用索引的原則:
1、裝載資料後再建立索引。
2、頻繁搜尋的列可以作為索引。
3、在聯接屬性上建立索引(主外來鍵)。
4、經常排序分組的列。
5、刪除不經常使用的索引。
6、指定索引塊的引數,如果將來會在表上執行大量的insert操作,建立索引時設定較大的ptcfree。
7、指定索引所在的表空間,將表和索引放在不同的表空間上可以提高效能。
8、對大型索引,考試使用NOLOGGING子句建立大型索引。
不要在下面的列建立索引:
1、僅包含幾個不同值得列。
2、表中僅包含幾條記錄。
btree 索引
優點:適合鍵值重複率較低的欄位上使用
那麼有個B-tree索引我們就像翻書目錄一樣,直接定位rowid立刻就找到了我們想要的資料,實質減少了I/O操作就提高速度,它有一 個顯著特點查詢效能與表中資料量無關
缺點:不適合鍵值重複率較高的欄位上使用,
點陣圖索引
點陣圖索引適合於:列的基數很少,可列舉,重複值很多,資料不會被經常更新,由於一個鍵值對應很多行(rowid), 更新索引鍵值的時候,就會鎖定索引,導致其他行不可被修改,阻塞。
優點:OLAP 例如報表類資料庫 重複率高的資料 特定型別的查詢例如count、or、and等邏輯操作因為只需要進行位運算即可得到我們需要的結果
缺點:不適合重複率低的欄位,還有經常DML操作(insert,update,delete),因為點陣圖索引的鎖代價極高,修改一個點陣圖索引段影響整個點陣圖段,例如修改
一個鍵值,會影響同鍵值的多行,所以對於OLTP 系統點陣圖索引基本上是不適用的
主鍵索引和唯一索引
主鍵是一種約束,唯一索引是一種索引,兩者在本質上是不同的。
主鍵建立後一定包含一個唯一性索引,唯一性索引並不一定就是主鍵。
唯一性索引列允許空值,而主鍵列不允許為空值。主鍵列在建立時,已經預設為空值 + 唯一索引了。
主鍵可以被其他表引用為外來鍵,而唯一索引不能。一個表最多隻能建立一個主鍵,但可以建立多個唯一索引。
主鍵更適合那些不容易更改的唯一標識,如自動遞增列、身份證號等。
唯一索引的好處:
一是簡化了MySQL對這個索引的管理工作,這個索引也因此而變得更有效率;
二是MySQL會在有新記錄插入資料表時,自動檢查新記錄的這個欄位的值是否已經在某個記錄的這個欄位裡出現過了;如果是,MySQL將拒絕插入那條新記錄。也就是說,唯一索引可以保證資料記錄的唯一性。
事實上,在許多場合,人們建立唯一索引的目的往往不是為了提高訪問速度,而只是為了避免資料出現重複。
主索引
必須為主鍵欄位建立一個索引,這個索引就是所謂的"主索引"。主索引與唯一索引的唯一區別是:前者在定義時使用的關鍵字是PRIMARY而不是UNIQUE。