一. 定義
索引是為了加速對錶中資料行的檢索而建立的一種分散的儲存結構。索引是針對表而建立的,它是由資料頁面以外的索引頁面組成的,每個索引頁面中的行都會含有邏輯指標,以便加速檢索物理資料。
二.優缺點
優點:1.大大加快資料的檢索速度;
2.建立唯一性索引,保證資料庫表中每一行資料的唯一性;
3.加速表和表之間的連線;
4.在使用分組和排序子句進行資料檢索時,可以顯著減少查詢中分組和排序的時間。
缺點:1.索引需要佔物理空間。
2.當對表中的資料進行增加、刪除和修改的時候,索引也要動態的維護,降低了資料的維護速度。
三.索引型別
sql sever索引型別有:唯一索引,主鍵索引,聚集索引,非聚集索引
mysql 索引型別有:唯一索引,主鍵(聚集)索引,非聚集索引,全文索引
sql的主流索引結構有b+樹以及hash結構,聚集索引以及非聚集索引用的是b+樹索引
mysql的myisam儲存引擎的聚集索引和非聚集索引只多了個唯一約束,其他沒什麼區別
名詞解釋:
(1)聚集(clustered)索引,也叫聚簇索引
資料行的物理順序與列值(一般是主鍵的那一列)的邏輯順序相同,乙個表中只能擁有乙個聚集索引
如果不建立聚集索引,系統會自動建立乙個隱含列作為表的聚集索引。
sql sever預設主鍵為聚集索引,也可以指定為非聚集索引,而mysql裡主鍵就是聚集索引
最好還是在建立表的時候新增聚集索引,由於聚集索引的物理順序上的特殊性,因此如果再在上面建立索引的時候會根據索引列的排序移動全部資料行上面的順序,會非常地耗費時間以及效能。
(2)非聚集(unclustered)索引
該索引中索引的邏輯順序與磁碟上行的物理儲存順序不同,乙個表中可以擁有多個非聚集索引
(3)唯一索引(unique)
是不允許其中任何兩行具有相同索引值的索引。可以有null值,乙個表可以有多個唯一索引。
(4)全文索引(fulltext)
全文索引通常使用倒排索引來實現
舊版的mysql的全文索引只能用在myisam**的char、varchar和text的字段上
從innodb1.2.x版本(mysql5.6.24以上)開始,innodb儲存引擎開始支援全文索引,其支援myisam的全部功能,並且還支援其他的一些特性。
(5)主鍵索引(primary)
簡稱為主索引,資料庫表中一列或列組合(字段)的值唯一標識表中的每一行。該列稱為表的主鍵。唯一且不能為有null值。乙個表只能有乙個主鍵索引。
(6)候選索引
符合主索引的要求,但沒有被選為表的主索引的索引
與主索引一樣要求字段值的唯一性,並決定了處理記錄的順序。在資料庫和自由表中,可以為每個表建立多個候選索引
(7)復合索引(聯合索引)
索引使用技巧名稱,兩個或更多個列上的索引被稱作復合索引。
(8)字首索引
索引使用技巧名稱,對串列進行索引,如果可能應該指定乙個字首長度。例如,如果有乙個char(255)的 列,如果在前10 個或20 個字元內,多數值是惟一的,那麼就不要對整個列進行索引。字首索引不僅可以提高查詢速度而且可以節省磁碟空間和i/o操作。
(8)最左原則
對於復合索引:mysql從左到右的使用索引中的字段,乙個查詢可以只使用索引中的一部份,但只能是最左側部分
四.索引使用場合
表的字段唯一約束
直接條件查詢的字段
查詢中與其它表關聯的字段
查詢中排序的字段
查詢中統計或分組統計的字段
五.索引不適用場合
表記錄太少
經常插入、刪除、修改的表
資料重複且分布平均的表字段
經常和主欄位一塊查詢但主字段索引值比較多的表字段
六.索引注意事項
(1) 不是什麼情況都非得建索引不可,比如性別可能就只有兩個值,建索引不僅沒什麼優勢,還會影響到更新速度,這被稱為過度索引
(2) mysql查詢每次只能使用乙個索引
(3) 在建立復合索引時應該將最常用作限制條件的列放在最左邊,依次遞減
(4) 索引不會包含有null值的列
只要列中包含有null值都將不會被包含在索引中,復合索引中只要有一列含有null值,那麼這一列對於此復合索引就是無效的。所以我們在資料庫設計時不要讓字段的預設值為null
(5)排序的索引問題
mysql查詢只使用乙個索引,因此如果where子句中已經使用了索引的話,那麼order by中的列是不會使用索引的。因此資料庫預設排序可以符合要求的情況下不要使用排序操作;盡量不要包含多個列的排序,如果需要最好給這些列建立復合索引。
(6)like語句操作
一般情況下不鼓勵使用like操作,如果非使用不可,如何使用也是乙個問題。like 「%aaa%」 不會使用索引而like 「aaa%」可以使用索引。
(7)不要在列上進行運算
(8) 條件語句中 有 or 會是索引不起作用
(9)explain可以幫助開發人員分析sql問題,explain顯示了mysql如何使用索引來處理select語句以及連線表,可以幫助選擇更好的索引和寫出更優化的查詢語句。
(10)不使用not in 、<>、!=操作,但<,<=,=,>,>=,between,in是可以用到索引的
(11)對於那些定義為text、image和bit資料型別的列不應該增加索引。因為這些列的資料量要麼相當大,要麼取值很少
(12)索引字段型別和sql欄位型別需要保持一致,否則索引會無效
mysql 整理索引 Mysql索引整理
1 mysql基本單位是頁,大小為16kb 16384 1024 頁是為了增加查詢效率,減少io的互動 區域性性原理 2 頁與頁之間是雙向鍊錶,插入的時候會根據主鍵id進行排序 單葉資料結構.jpg 3 在頁上有乙個頁目錄,相當於把資料進行分組,存放的是當前組最小的主鍵id,指標並且指向對應的資料 ...
資料庫索引基礎知識整理
一 索引 1.索引主要分 主鍵索引 唯一索引 普通索引 全文索引 2.建立索引的目的 加快表的查詢和排序 3.建立索引方法 1 create index 索引名 on 表名 列表名 2 alter table 表名 add index 索引名 列表名 3 create table 表名 index ...
mysql 索引 磁碟整理 mysql 索引整理
1 只對 where 和 order by 子句中需要的列新增索引,多餘的索引智慧型導致不必要的硬碟空間愛你消耗。每次修改表資訊時會更新索引,因此有索引的表效能會相應降低。2 對於要使用索引的列要使用屬性 not null 這樣就永遠不會儲存 null 值。3 最好用唯一化索引,一般情況下,當查詢優...