本文將從作用、引擎、分類、使用等方面來介紹 mysql 的索引。
索引的建立是為了提高資料的訪問速度。生活中索引的例子有字典,字典的索引就是它的目錄,通過拼音或者筆畫我們可以在目錄中找到這個字以及它的頁碼,進而可以檢視這個字的具體解釋說明。
資料庫引擎是提供了對資料的增加、刪除、修改、查詢和儲存的實現,並提供索引、事務、鎖、外來鍵等部分或全部的功能。
isam
isam是乙個定義明確且歷經時間考驗的資料**管理方法,它在設計之時就考慮到 資料庫被查詢的次數要遠大於更新的次數。因此,isam執行讀取操作的速度很快,而且不占用大量的記憶體和儲存資源。isam的兩個主要不足之處在於,它不 支援事務處理,也不能夠容錯:如果你的硬碟崩潰了,那麼資料檔案就無法恢復了。
myisam
myisam是mysql的isam擴充套件格式。除了提供isam裡所沒有的索引和字段管理的大量功能,myisam還使用一種**鎖定的機制,來優化多個併發的讀寫操作,其代價是你需要經常執行optimize table命令,來恢復被更新機制所浪費的空間。myisam還有一些有用的擴充套件,例如用來修復資料庫檔案的myisamchk工具和用來恢復浪費空間的 myisampack工具。
myisam 支援全文索引、b+tree 索引、t-tree索引
innodb
innodb資料庫引擎都是造就mysql靈活性的技術的直接產品,這項技術就是mysql++ api。在使用mysql的時候,你所面對的每乙個挑戰幾乎都源於isam和myisam資料庫引擎不支援事務處理(transaction process)也不支援外來鍵。儘管要比isam和 myisam引擎慢很多,但是innodb包括了對事務處理和外來鍵的支援,這兩點都是前兩個引擎所沒有的。innodb給mysql提供了具有提交、回滾和崩潰恢復能力的事務安全(acid相容)儲存引擎。innodb鎖定在行級並且也在select語句提供乙個oracle風格一致的非鎖定讀,這些特色增加了多使用者部署和效能。沒有在innodb中擴大鎖定的需要,因為在innodb中行級鎖定適合非常小的空間。innodb也支援foreign key強制。
innodb 支援 b+tree 索引。
全文索引
全文索引是myisam的乙個特殊索引型別,主要用於全文檢索。一般在 char、varchar 或 text 列上建立。
雜湊索引
通過雜湊表來進行對資料的索引。mysql中,只有memory儲存引擎顯示支援hash索引。
b-tree 索引
r-tree 索引
這裡不介紹。
單列索引
單列索引對單個的列進行索引。
多列索引
多列索引(即組合索引)對多個列同時進行索引。
普通索引
最基本的索引,沒有任何限制。
唯一索引
索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。
主鍵它是一種特殊的唯一索引,不允許有空值。
聚集索引
聚集索引保證關鍵字的值相近的元組儲存的物理位置也相同。聚集索引的邏輯順序與實際記錄的物理順序一致。
非聚集索引
非聚集索引的邏輯順序與實際記錄的物理順序不一致。
請參考 codinglabs 的mysql索引背後的資料結構及演算法原理 「為什麼使用b-tree(b+tree)」一節。
myisam 引擎與 innodb 引擎對 b-tree 的實現的區別主要在於,myisam 中 b-tree 是非聚集索引,innodb 中 b-tree 是聚集索引。
myisam 引擎 b-tree 索引的實現
請參考 codinglabs 的mysql索引背後的資料結構及演算法原理 「myisam索引實現」一節。
innodb 引擎 b-tree 索引的實現
請參考 codinglabs 的mysql索引背後的資料結構及演算法原理 「codinglabs 的mysql索引背後的資料結構及演算法原理 」一節。
普通索引、組合索引(組合索引)
create
table tableanme (fieldname1 columntype,fieldname2 columntype,index [indexname] (fieldname1 [,fieldname2...]));
create
table tablename add index [indexname] (fieldname1 [fieldname2...]);
alter
table slaes add index(value);
drop index [indexname] on mytable;
唯一索引create
table ui_test (f1 int,f2 int,unique(f1));
alter
table ui_test add
unique(f2);
drop index [indexname] on mytable;
主鍵索引create
table pk_test(f1 int
notnull,primary
key(f1));
alter
table customer modify id int
notnull, add
primary
key(id);
alter
table pk_test drop
primary
key;
全文索引create
table ft2 (f1 varchar(255),fulltext(f1));
drop index [indexname] on mytable;
Mysql 索引底層結構探索
索引用於提高資料庫表的資料訪問速度的一種資料結構,binary search trees red black trees b trees b trees,這些都可以用來做索引,為什麼mysql偏偏選擇b trees呢?下面我們就來分析一下原因 衡量乙個索引是否高效 io漸進複雜度 binary se...
MySQL索引優化之分頁探索詳細介紹
目錄 表結構create table demo id int 11 not null auto increment,name varchar 50 character set utf8mb4 collate utf8mb4 090www.cppcns.com0 ai ci not null defa...
mysql 索引 手冊 MySQL 索引
mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...