MySQL 索引
https://dev.mysql.com/doc/refman/5.7/en/create-index.html
MySQL索引的建立對(duì)于MySQL的高效運(yùn)行是很重要的以舒,索引可以大大提高M(jìn)ySQL的檢索速度墓卦。
打個(gè)比方埠偿,如果合理的設(shè)計(jì)且使用索引的MySQL是一輛蘭博基尼的話,那么沒有設(shè)計(jì)和使用索引的MySQL就是一個(gè)人力三輪車。
索引分單列索引和組合索引。單列索引,即一個(gè)索引只包含單個(gè)列诺舔,一個(gè)表可以有多個(gè)單列索引,但這不是組合索引备畦。組合索引低飒,即一個(gè)索引包含多個(gè)列。
創(chuàng)建索引時(shí)懂盐,你需要確保該索引是應(yīng)用在 SQL 查詢語(yǔ)句的條件(一般作為 WHERE 子句的條件)褥赊。
實(shí)際上,索引也是一張表莉恼,該表保存了主鍵與索引字段拌喉,并指向?qū)嶓w表的記錄。
上面都在說使用索引的好處俐银,但過多的使用索引將會(huì)造成濫用尿背。因此索引也會(huì)有它的缺點(diǎn):雖然索引大大提高了查詢速度,同時(shí)卻會(huì)降低更新表的速度捶惜,如對(duì)表進(jìn)行INSERT田藐、UPDATE和DELETE。因?yàn)楦卤頃r(shí),MySQL不僅要保存數(shù)據(jù)汽久,還要保存一下索引文件鹤竭。
建立索引會(huì)占用磁盤空間的索引文件。
普通索引
創(chuàng)建索引
這是最基本的索引景醇,它沒有任何限制臀稚。它有以下幾種創(chuàng)建方式:
CREATE INDEX indexName ON mytable(username(length));
如果是CHAR,VARCHAR類型啡直,length可以小于字段實(shí)際長(zhǎng)度烁涌;如果是BLOB和TEXT類型苍碟,必須指定 length酒觅。
修改表結(jié)構(gòu)(添加索引)
ALTER table tableName ADD INDEX indexName(columnName)
創(chuàng)建表的時(shí)候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length))
);
刪除索引的語(yǔ)法
DROP INDEX [indexName] ON mytable;
唯一索引
它與前面的普通索引類似,不同的就是:索引列的值必須唯一微峰,但允許有空值舷丹。如果是組合索引,則列值的組合必須唯一蜓肆。它有以下幾種創(chuàng)建方式:
創(chuàng)建索引
CREATE UNIQUE INDEX indexName ON mytable(username(length))
修改表結(jié)構(gòu)
ALTER table mytable ADD UNIQUE [indexName] (username(length))
創(chuàng)建表的時(shí)候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
UNIQUE [indexName] (username(length))
);
使用ALTER 命令添加和刪除索引
有四種方式來(lái)添加數(shù)據(jù)表的索引:
-
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list)
: 該語(yǔ)句添加一個(gè)主鍵颜凯,這意味著索引值必須是唯一的,且不能為NULL仗扬。 -
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list)
: 這條語(yǔ)句創(chuàng)建索引的值必須是唯一的(除了NULL外症概,NULL可能會(huì)出現(xiàn)多次)。 -
ALTER TABLE tbl_name ADD INDEX index_name (column_list)
: 添加普通索引早芭,索引值可出現(xiàn)多次彼城。 -
ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list)
:該語(yǔ)句指定了索引為 FULLTEXT ,用于全文索引退个。
以下實(shí)例為在表中添加索引募壕。
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
你還可以在 ALTER 命令中使用 DROP 子句來(lái)刪除索引。嘗試以下實(shí)例刪除索引:
mysql> ALTER TABLE testalter_tbl DROP INDEX c;
使用 ALTER 命令添加和刪除主鍵
主鍵只能作用于一個(gè)列上语盈,添加主鍵索引時(shí)舱馅,你需要確保該主鍵默認(rèn)不為空(NOT NULL)。實(shí)例如下:
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
你也可以使用 ALTER 命令刪除主鍵:
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
刪除主鍵時(shí)只需指定PRIMARY KEY刀荒,但在刪除索引時(shí)代嗤,你必須知道索引名。
顯示索引信息
你可以使用 SHOW INDEX 命令來(lái)列出表中的相關(guān)的索引信息缠借「梢悖可以通過添加 \G 來(lái)格式化輸出信息。
嘗試以下實(shí)例:
mysql> SHOW INDEX FROM table_name; \G
........