索引簡介
索引是乙個單獨的、物理的資料庫結構,它是某個表中一列或若干列值的集合與相應的指向表中資料的指標組成清單。索引的作用相當於書的目錄,可以根據目錄中的頁碼快速定位到所需的內容。索引是一種使記錄有序化的技術,它從邏輯上對記錄進行排序而不影響物理儲存的資料。
優點:加速資料檢索
建立唯一可以索引保證每一行資料的唯一性
加速連線查詢、排序、分組操作
缺點:需要額外的物理空間進行儲存
資料增刪改的時候需要動態維護索引,耗費時間
增加優化器在選擇索引時的計算代價
注意:要合理選擇必要的字段建立索引!
索引型別
普通索引:這是最基本的索引,它沒有任何限制。
唯一索引:它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。
主鍵索引:它是一種特殊的唯一索引,不允許有空值。一般是在建表的時候同時建立主鍵索引。
組合索引與單列索引:單列索引是針對乙個字段建立的索引,組合索引是針對多個字段建立乙個索引,但是如果字段順序不同,那麼代表索引也是不同的。
聚集索引與非聚集索引:聚集索引表示表中儲存的資料按照索引的順序儲存,檢索效率比非聚集索引高,但對資料更新影響較大。非聚集索引表示資料儲存在乙個地方,索引儲存在另乙個地方,索引帶有指標指向資料的儲存位置,非聚集索引檢索效率比聚集索引低,但對資料更新影響較小。
索引結構
hash索引
將索引鍵通過 hash 運算之後,將 hash運算結果的 hash 值和所對應的行指標資訊存放於乙個 hash 表中。
優點:通過雜湊運算得到的hash值一次定位,適合精準查詢。
缺點:索引中儲存的是hash值,hash值的大小關係同原值的大小關係不能保證一致,因此不能用於「like」等範圍查詢和排序,此外還不能利用組合索引的部分查詢特性。由於還需通過行指標訪問實際的表資料,因此不能避免對錶的掃瞄。
b-tree索引
b-tree(平衡多路查詢樹)的特性:乙個度為d的b-tree,設其索引n個key,則其樹高h的上限為logd((n+1)/2),檢索乙個key,其查詢節點個數的漸進複雜度為o(logdn) 。
由於索引本身也很大,不可能全部儲存在記憶體中,因此索引往往也是以索引檔案的形式儲存的磁碟上,樹狀結構可以大大減少磁碟io次數已提高查詢速度。根據區域性性原理和磁碟預讀特性,資料庫系統將乙個節點的大小設為磁碟乙個頁的大小,這樣每個節點的資料只需一次io就能載入。實際應用中b樹的度往往大於100即百萬級資料也只需3次io。
mysql使用的innodb 儲存引擎中 b-tree 索引使用的儲存結構實際上是 b+tree,它是b-tree的變種,相比b-tree,b+tree的內部節點不儲存關鍵字對應的指標,因此每個節點可以容納更多的關鍵字,相對的可以減少磁碟io次數。另外每個葉子節點會儲存相鄰的後乙個葉子節點的指標,可以加速多個相鄰葉子節點的檢索。
建立索引
視覺化工具建立
sql語句
create index [idxname] on [table]([field]([length]))
alter table [table] add index [idxname]([field]([length]))
索引使用情景(重要)
適合建立索引條件
出現在on 條件或where條件中的列
經常用於排序或分組的列
經常使用聚集函式(如count/min/max/sum)的列
不適合建立索引的條件
頻繁新增、修改刪除的表
資料量比較小的表
選擇性不高的列(例如性別)
使用索引注意事項
索引應該建在選擇性高的字段上(鍵值唯一的記錄數/總記錄條數),選擇性越高索引的效果越好、價值越大,唯一索引的選擇性最高
組合索引中字段的順序,選擇性越高的字段排在最前面
不要重複建立彼此有包含關係的索引,如index1(a,b,c) 、index2(a,b)、index3(a) (最左字首原理)
索引值不應過大,組合索引的字段不要過多,如果超過4個字段,一般需要考慮拆分成多個單列索
資料量較少的時候,全表掃瞄比使用索引快,則不使用索引
索引列不能包含null,復合索引中只要有一列含有null值,那麼這一列對於此復合索引就是無效的
使用短索引
導致索引失效的情況
對索引列進行運算 錯誤: select * from test where id-1=9;
使用or操作符(對所有列設定單列索引,union)
使用not in ,not exist,<>
%開頭的like
組合索引的索引列以不同順序排序或先後順序不同
條件中不含組合索引的中間字段
無條件檢索全部記錄
mysql 刪除重複索引 去掉mysql重複的索引
create table t id int not null primary key,a int not null,index id engine innodb 乙個經驗不足的使用者可能是想建立乙個主鍵,然後再加上索引以供查詢使用。事實上主鍵也就是索引了。所以完全沒必要再新增index id 了。可...
mysql主鍵可以為空嗎
mysql主鍵不可以為空,因為當建立或者更改表時可以通過定義 primary key 約束來建立主鍵,而乙個表只能有乙個主鍵約束,並且主鍵約束中的列不能是空值,由於主鍵約束確保唯一資料,所以經常來定義標識列。資料庫主鍵是指表中乙個列或者列的組合,其值能夠唯一的標識表中的每乙個行。這樣的一列或者多列成...
mysql 冗餘和重複索引
mysql允許在相同列上建立多個索引,無論是有意還是無意,mysql需要單獨維護重複的索引,並且優化器在優化查詢的時候也需要逐個地進行考慮,這會影響效能。create table test id intnot null primary key,a intnot null b intnot null,...