創建索引時使用的索引方式,有btree和hash兩種
CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX index_name [index_type] ON tbl_name (key_part,...) [index_option] [algorithm_option | lock_option] ... key_part: col_name [(length)] [ASC | DESC] index_option: KEY_BLOCK_SIZE [=] value | index_type | WITH PARSER parser_name | COMMENT 'string' index_type: USING {BTREE | HASH} algorithm_option: ALGORITHM [=] {DEFAULT | INPLACE | COPY} lock_option: LOCK [=] {DEFAULT | NONE | SHARED | EXCLUSIVE}
一些存儲引擎允許您在創建索引時指定索引類型。例如:
CREATE TABLE lookup (id INT) ENGINE = MEMORY; CREATE INDEX id_index ON lookup (id) USING BTREE;
B-TREE索引的特點
B-TREEB-TREE以B+樹結構存儲數據,大大加快了數據的查詢速度
B-TREE索引在范圍查找的SQL語句中更加適合(順序存儲)
B-TREE索引使用場景
全值匹配的查詢SQL,如 where act_id= '1111_act'
聯合索引匯中匹配到最左前綴查詢,如聯合索引 KEY idx_actid_name(act_id,act_name) USING BTREE,只要條件中使用到了聯合索引的第一列,就會用到該索引,但如果查詢使用到的是聯合索引的第二列act_name,該SQL則便無法使用到該聯合索引(注:覆蓋索引除外)
匹配模糊查詢的前匹配,如where act_name like '11_act%'
匹配范圍值的SQL查詢,如where act_date > '9865123547215'(not in和<>無法使用索引)
覆蓋索引的SQL查詢,就是說select出來的字段都建立了索引
HASH索引的特點
Hash索引基於Hash表實現,只有查詢條件精確匹配Hash索引中的所有列才會用到hash索引
存儲引擎會為Hash索引中的每一列都計算hash碼,Hash索引中存儲的即hash碼,所以每次讀取都會進行兩次查詢
Hash索引無法用於排序
Hash不適用於區分度小的列上
參考:https://dev.mysql.com/doc/refman/5.7/en/create-index.html