免費MySQL課程:阿里雲大學——開發者課堂mysql
MySQL索引的創建對於MySQL的高效運行是很重要的,索引能夠大大提升MySQL的檢索速度。sql
打個比方,若是合理的設計且使用索引的MySQL是一輛蘭博基尼的話,那麼沒有設計和使用索引的MySQL就是一我的力三輪車。less
索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表能夠有多個單列索引,但這不是組合索引。組合索引,即一個索包含多個列。阿里雲
建立索引時,你須要確保該索引是應用在 SQL 查詢語句的條件(通常做爲 WHERE 子句的條件)。spa
實際上,索引也是一張表,該表保存了主鍵與索引字段,並指向實體表的記錄。設計
上面都在說使用索引的好處,但過多的使用索引將會形成濫用。所以索引也會有它的缺點:雖然索引大大提升了查詢速度,同時卻會下降更新表的速度,如對錶進行INSERT、UPDATE和DELETE。由於更新表時,MySQL不只要保存數據,還要保存一下索引文件。code
創建索引會佔用磁盤空間的索引文件。blog
普通索引索引
建立索引開發
這是最基本的索引,它沒有任何限制。它有如下幾種建立方式:
CREATE INDEX indexName ON mytable(username(length));
若是是CHAR,VARCHAR類型,length能夠小於字段實際長度;若是是BLOB和TEXT類型,必須指定 length。
修改表結構(添加索引)
ALTER mytable ADD INDEX [indexName] ON (username(length))
建立表的時候直接指定
CREATE TABLE mytable (ID INT NOT NULL,username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)));
刪除索引的語法
DROP INDEX [indexName] ON mytable;
惟一索引
它與前面的普通索引相似,不一樣的就是:索引列的值必須惟一,但容許有空值。若是是組合索引,則列值的組合必須惟一。它有如下幾種建立方式:
建立索引
CREATE UNIQUE INDEX indexName ON mytable(username(length))
修改表結構
ALTER table mytable ADD UNIQUE [indexName] (username(length))
建立表的時候直接指定
CREATE TABLE mytable (ID INT NOT NULL,username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)));
使用ALTER 命令添加和刪除索引
有四種方式來添加數據表的索引:
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 ,用於全文索引。
如下實例爲在表中添加索引。
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
你還能夠在 ALTER 命令中使用 DROP 子句來刪除索引。嘗試如下實例刪除索引:
mysql> ALTER TABLE testalter_tbl DROP INDEX c;
使用 ALTER 命令添加和刪除主鍵
主鍵只能做用於一個列上,添加主鍵索引時,你須要確保該主鍵默認不爲空(NOT NULL)。實例以下:
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;
刪除指定時只需指定PRIMARY KEY,但在刪除索引時,你必須知道索引名。
顯示索引信息
你可使用 SHOW INDEX 命令來列出表中的相關的索引信息。能夠經過添加 \G 來格式化輸出信息。
嘗試如下實例:
mysql> SHOW INDEX FROM table_name; \G........
免費MySQL課程:阿里雲大學——開發者課堂