MySQL索引分类
(1)、主鍵索引
設定為主鍵后數據庫會自動建立索引,innodb為聚簇索引
(1)如果表定義了主鍵,則PK就是聚集索引;
(2)如果表沒有定義主鍵,則第一個非空唯一索引(not NULL unique)列是聚集索引;
(3)否則,InnoDB會創建一個隱藏的row-id作為聚集索引;(這個row-id是6位的,所以盡量我們指定主鍵)
(2)、單值索引
即一個索引只包含單個列,一個表可以有多個單列索引
(3)、唯一索引
索引列的值必須唯一,但允許有空值
(4)、復合索引
即一個索引包含多個列
在數據庫操作期間,復合索引比單值索引所需要的開銷更小(對于相同的多個列建索引)
當表的行數遠大于索引列的數目時可以使用復合索引
#隨表一起建索引: CREATE TABLE customer (id INT(10) UNSIGNED AUTO_INCREMENT ,customer_no VARCHAR(200),customer_name VARCHAR(200),PRIMARY KEY(id),KEY (customer_name),UNIQUE (customer_name),KEY (customer_no,customer_name) ); #單獨建索引: CREATE INDEX idx_no_name ON customer(customer_no,customer_name); #刪除索引: DROP INDEX idx_no_name on customer ;基本語法
創建:ALTER mytable ADD [UNIQUE ] INDEX [indexName] ON (columnname(length))
刪除:DROP INDEX [indexName] ON mytable;
查看:SHOW INDEX FROM table_name\G
有四種方式來添加數據表的索引:
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 該語句添加一個主鍵,這意味著索引值必須是唯一的,且不能為NULL。
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 這條語句創建索引的值必須是唯一的(除了NULL外,NULL可能會出現多次)。
ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出現多次。
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):該語句指定了索引為 FULLTEXT ,用于全文索引。
哪些情況需要創建索引
主鍵自動建立唯一索引
頻繁作為查詢條件的字段應該創建索引(where 后面的語句)
查詢中與其它表關聯的字段,外鍵關系建立索引
單鍵/組合索引的選擇問題,who?(在高并發下傾向創建組合索引)
查詢中排序的字段,排序字段若通過索引去訪問將大大提高排序速度
查詢中統計或者分組字段
哪些情況不要創建索引
表記錄太少
經常增刪改的表:提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。 因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件
Where條件里用不到的字段不創建索引
數據重復且分布平均的表字段,因此應該只為最經常查詢和最經常排序的數據列建立索引,某個數據列包含許多重復的內容,建立索引沒有太大實際效果。
總結
- 上一篇: 什么是磁盘io?
- 下一篇: 索引的匹配方式有哪些?