內容主要摘抄自《MySQL5.7從入門到精通》html
索引是對數據庫表中的一列或多列進行排序的一種數據結構,使用索引能夠提升數據庫中特定數據的查詢速度。java
索引是一個單獨的、存儲在磁盤上的數據庫結構,它們包含着對數據表裏全部記錄的引用指針。mysql
mysql 中索引存儲類型有兩種:BTREE 和 HASH,具體和表的存儲引擎相關;MyISAM 和 InnoDB 存儲引擎只支持 BTREE 索引;MEMORY/HEAP 存儲引擎能夠支持 HASH 和 BTREE 索引。sql
普通索引和惟一索引數據庫
普通索引:定義的索引列運行有空值和重複值。
惟一索引:索引列的值必須惟一,容許有空值。數據結構
單列索引和組合索引app
單列索引:一個索引只包含單列。
組合索引:在表的多個字段組合上建立的索引,使用組合索引時遵循最左前綴集合,只有查詢條件中使用了這些字段的左邊字段,索引纔會被使用。性能
全文索引測試
全文索引類型爲 FULLTEXT,在定義索引的列上支持值的全文查找,容許索引列插入重複值和空值。全文索引能夠在字符或文本類型的列上建立,mysql 中只有 MyISAM 存儲引擎支持全文索引。優化
空間索引
mysql 空間數據類型有四種:GEOMETRY、POINT、LINESTRING 和 POLYGON。空間索引是對空間數據類型的字段創建的索引,建立空間索引的列必須聲明爲 NOT NULL。
索引並不是越多越好
一個表中如有大量索引,會佔用磁盤空間,也會影響 insert、delete、update 等語句的性能,由於表中數據更改時,索引也會進行調整和更新。
索引中的列儘量的少
對常常查詢的字段應該建立索引,但要避免添加沒必要要的字段。
對數據量小的表不要使用索引
因爲數據較少,查詢的花費的時間可能比遍歷索引的時間還要短,可能不會產生優化效果。
在不一樣值較多的列上創建索引
例如性別字段上只有「男」,「女」,「其餘」,三個不一樣值,若在性別列上創建索引,可能不但不會提升查詢效率,反而會嚴重下降數據更新速度。
SHOW INDEX FROM test;
通常查詢結果顯示的是表格形式,在查詢語句後加上 \G 能夠將查詢結果縱向顯示。
上圖顯示 id 爲惟一索引。
官網參考手冊(5.7)-- CREATE INDEX Syntax
建立名爲 idx_name 的普通索引,對惟一性沒有限制
CREATE TABLE test2 ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(255) NOT NULL, num int(11) NOT NULL DEFAULT 0, created_at timestamp NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`), INDEX idx_name(name(5)) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INDEX idx_name(name(5))
上面語句指的是截取字段 name 前5個字符做爲索引,也就是說每條記錄的name字段的值的前5個字符不能出現重複,不然在使用 INSERT 時會出現 「Duplicate」 錯誤。
ALTER TABLE test2 ADD INDEX idx_name(name(5));
CREATE INDEX idx_name ON test2(name(5));
ALTER TABLE test2 DROP INDEX idx_name;
DROP INDEX idx_name ON test2;
普通索引
"idx_" 前綴加上字段名稱,eg: idx_name
惟一索引
"uniq_"前綴加上字段名稱,eg: uniq_name
長度不超過767bytes,聯合索引長度不超過3072bytes。
於InnoDB索引長度限制的tips
mysql innodb存儲與索引的總結
建立一個表,字段以下:
批量插入80萬條數據,name長度爲30字符左右
建立索引花了3秒多,建立索引後同一條查詢語句,執行時間加快的差很少770倍,對比仍是很明顯的