注:本篇文章是對菜鳥教程中的mysql索引(http://www.runoob.com/mysql/mysql-index.html)的翻譯版本;添加了示例,便於理解;
索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索引包含多個列。
創建索引時,你需要確保該索引是應用在 SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。
普通索引
創建索引
這是最基本的索引,它沒有任何限制。它有以下幾種創建方式:
CREATE INDEX indexName ON mytable(username(length));
注:indexName是索引名稱,username是字段名
如果是CHAR,VARCHAR類型,length可以小於字段實際長度;如果是BLOB和TEXT類型,必須指定 length。
舉例:
CREATE TABLE employee(
id INT,
sname VARCHAR(50),
age INT ,
PASSWORD VARCHAR(50)
);
#創建索引
CREATE INDEX index_sname ON employee(sname(20)); #注意添加索引的長度必須小於建表時給字段定義的長度,也可以不給長度,如:CREATE INDEX index_sname ON employee(sname);
#刪除索引
DROP INDEX index_sname ON employee;
修改表結構(添加索引)
ALTER table tableName ADD INDEX indexName(columnName)
舉例:
ALTER TABLE employee ADD INDEX index_sname(sname);#這里可以不指定索引的長度
創建表的時候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] (username(length)) );
舉例:
CREATE TABLE teacher(
id INT NOT NULL,
teachername VARCHAR(16) NOT NULL,
INDEX index_teachername(teachername(5))
);
CREATE TABLE tea(
id INT NOT NULL,
teaname VARCHAR(16) NOT NULL,
INDEX (teaname)
);
刪除索引的語法
DROP INDEX [indexName] ON mytable;
舉例:
DROP INDEX index_sname ON employee;
唯一索引
它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。它有以下幾種創建方式:
創建索引
CREATE UNIQUE INDEX indexName ON mytable(username(length))
舉例:
CREATE TABLE tea(
id INT NOT NULL,
teaname VARCHAR(16) NOT NULL,
INDEX (teaname)
);
CREATE UNIQUE INDEX index_teaname ON tea(teaname(4));
CREATE UNIQUE INDEX index_teaname ON tea(teaname);#也可以不給長度
修改表結構
ALTER table mytable ADD UNIQUE [indexName] (username(length))
舉例:
CREATE TABLE student(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(50) NOT NULL COMMENT "學生姓名",
age VARCHAR(50) NOT NULL COMMENT "學生年齡"
);
ALTER TABLE student ADD UNIQUE index_sname (sname(20));
ALTER TABLE student ADD UNIQUE(sname);##也可以不指定長度
DROP INDEX index_sname ON student;
SHOW INDEX FROM student;
創建表的時候直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );
舉例:
CREATE TABLE cat(
id INT ,
catName VARCHAR(20),
UNIQUE INDEX index_catName(catName(5))
);
CREATE TABLE dog(
id INT ,
dogName VARCHAR(20),
UNIQUE INDEX index_dogName(dogName)
);
使用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 ,用於全文索引。
也可以一次性給多個列添加索引(多列索引)
-
ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3 ): 添加多列索引.
以下實例為在表中添加索引。
mysql> ALTER TABLE testalter_tbl ADD INDEX (c);
舉例:
CREATE TABLE student(
sid INT PRIMARY KEY AUTO_INCREMENT,
sname VARCHAR(50) NOT NULL COMMENT "學生姓名",
age VARCHAR(50) NOT NULL COMMENT "學生年齡"
);
ALTER TABLE student ADD INDEX index_sname(sname);
你還可以在 ALTER 命令中使用 DROP 子句來刪除索引。嘗試以下實例刪除索引:
mysql> ALTER TABLE testalter_tbl DROP INDEX c;
舉例:
ALTER TABLE student DROP INDEX index_sname;
使用 ALTER 命令添加和刪除主鍵
主鍵只能作用於一個列上,添加主鍵索引時,你需要確保該主鍵默認不為空(NOT NULL)。實例如下:
mysql> ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;#先修改為--不為空 mysql> ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);#然后添加主鍵
舉例:
CREATE TABLE cat(
id INT ,
catName VARCHAR(20),
UNIQUE INDEX index_catName(catName(5))
);
ALTER TABLE cat MODIFY id INT NOT NULL;
ALTER TABLE cat ADD PRIMARY KEY (id);
你也可以使用 ALTER 命令刪除主鍵:
mysql> ALTER TABLE testalter_tbl DROP PRIMARY KEY;
ALTER TABLE cat DROP PRIMARY KEY;
刪除主鍵時只需指定PRIMARY KEY(一個表只有一個主鍵),但在刪除索引時,你必須知道索引名。
顯示索引信息
你可以使用 SHOW INDEX 命令來列出表中的相關的索引信息。可以通過添加 \G 來格式化輸出信息。
嘗試以下實例:
mysql> SHOW INDEX FROM table_name;
