MySQL在創建數據表的時候創建索引
在MySQL中創建表的時候,可以直接創建索引。基本的語法格式如下:
CREATE TABLE 表名(字段名 數據類型 [完整性約束條件], [UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY [索引名](字段名1 [(長度)] [ASC | DESC]) );
- UNIQUE:可選。表示索引為唯一性索引。
- FULLTEXT;可選。表示索引為全文索引。
- SPATIAL:可選。表示索引為空間索引。
- INDEX和KEY:用於指定字段為索引,兩者選擇其中之一就可以了,作用是一樣的。
- 索引名:可選。給創建的索引取一個新名稱。
- 字段名1:指定索引對應的字段的名稱,該字段必須是前面定義好的字段。
- 長度:可選。指索引的長度,必須是字符串類型才可以使用。
- ASC:可選。表示升序排列。
- DESC:可選。表示降序排列。
MySQL創建普通索引
創建一個普通索引時,不需要加任何UNIQUE、FULLTEXT或者SPATIAL參數。
實例:創建一個名為index1的數據表,在表內的id字段上建立一個普通索引。
1. 創建普通索引的SQL代碼如下:
CREATE TABLE index1(id INT, name VARCHAR(20), sex BOOLEAN, INDEX(id)
);
在DOS提示符窗口中查看MySQL創建普通索引的操作效果。如下圖所示:
從上圖中可以看出,運行結果顯示普通索引創建成功。
2. 使用SHOW CREATE TABLE語句查看表的結構。如下圖所示:
從上圖中可以看出,在id字段上已經建立了一個名為id的普通索引。
語句:
KEY `id` (`id`)
圓括號內的id是字段名稱,圓括號左側外面的id是索引名稱。
3. 使用EXPLAIN語句查看索引是否被使用。SQL代碼如下:
EXPLAIN SELECT * FROM index1 where id=1 \G
在DOS提示符窗口中查看使用EXPLAIN語句查看索引是否被使用的操作效果。如下圖所示:
上圖中的結果顯示,possible_keys和key的值都為id。說明id索引已經存在,並且查詢時已經使用了索引。
MySQL創建唯一性索引
如果使用UNIQUE參數進行約束,則可以創建唯一性索引。
實例:創建一個名為index2的數據表,在表內的id字段上建立一個唯一性索引,並且設置id字段以升序的形式排列。
1. 創建一個唯一性索引的SQL代碼如下:
CREATE TABLE index2(id INT UNIQUE, name VARCHAR(20), UNIQUE INDEX index2_id(id ASC)
);
index2_id是為唯一性索引起的一個新名字。
在DOS提示符窗口中查看MySQL創建唯一性索引的操作效果。如下圖所示:
從上圖中可以看出,運行結果顯示創建成功。
2. 使用SHOW CREATE TABLE語句查看表的結構。SQL代碼如下:
SHOW CREATE TABLE index2 \G
在DOS提示符窗口中查看使用SHOW CREATE TABLE語句查看表的結構的效果。如下圖所示:
從上圖中可以看出,在id字段上建立了名為id和index2_id的兩個唯一性索引。這樣做,可以提高數據的查詢速度。
如果在創建index2表時,id字段沒有進行唯一性結束。如下所示:
CREATE TABLE index2(id INT, name VARCHAR(20), UNIQUE INDEX index2_id(id ASC)
);
則也可以在id字段上成功創建名為index2_id的唯一性索引。但是,這樣可能達不到提高查詢速度的目的。
MySQL創建全文索引
全文索引使用FULLTEXT參數,並且只能在CHAR、VARCHAR或TEXT類型的字段上創建。
全文索引可以用於全文搜索。
現在,MyISAM存儲引擎和InnoDB存儲引擎都支持全文索引。
實例:創建一個名為index3的數據表,在表中的info字段上建立名為index3_info的全文索引。
1. 創建全文索引的SQL代碼如下:
CREATE TABLE index3(id INT, info VARCHAR(20), FULLTEXT INDEX index3_info(info)
)ENGINE=MyISAM;
如果設置ENGINE=InnoDB,則可以在InnoDB存儲引擎上創建全文索引。
在DOS提示符窗口中查看MySQL創建全文索引的操作效果。如下圖所示:
從上圖中可以看出,代碼的執行結果顯示創建成功。
2. 使用SHOW CREATE TABLE語句查看index3數據表的結構。如下圖所示:
從上圖中可以看出,在info字段上已經建立了一個名為index3_info的全文索引。
注意
我使用的是MySQL 5.6.19版本,已經可以在InnoDB存儲引擎中創建全文索引了。
全文索引非常適合於大型數據集,對於小的數據集,它的用處可能比較小。
MySQL創建單列索引
單列索引是在數據表的單個字段上創建的索引。一個表中可以創建多個單列索引。唯一性索引和普通索引等都為單列索引。
實例:創建一個名為index4的數據表,在表中的subject字段上建立名為index4_st的單列索引。
1. 創建單列索引的SQL代碼如下:
CREATE TABLE index4(id INT, subject VARCHAR(30), INDEX index4_st(subject(10))
);
在DOS提示符窗口中查看MySQL創建單列索引的操作效果。如下圖所示:
從上圖中可以看出,代碼執行的結果顯示創建成功。
2. 使用SHOW CREATE TABLE語句查看index4數據表的結構。如下圖所示:
從上圖中可以看出,在subject字段上已經建立了一個名為index4_st的單列索引。
注意:subject字段長度為30,而index4_st設置的索引長度只有10,這樣做是為了提高查詢速度。對於字符型的數據,可以不用查詢全部信息,而只查詢它前面的若干字符信息。
MySQL創建多列索引
創建多列索引是在表的多個字段上創建一個索引。
實例:創建一個名為index5的數據表,在表中的name和sex字段上建立名為index5_ns的多列索引。
1. 創建多列索引的SQL代碼如下:
CREATE TABLE index5(id INT, name VARCHAR(20), sex CHAR(4), INDEX index5_ns(name,sex)
);
在DOS提示符窗口中查看MySQL創建多列索引的操作效果。如下圖所示:
從上圖中可以看出,代碼的執行結果顯示index5_ns索引創建成功。
2. 使用SHOW CREATE TABLE語句查看index5數據表的結構。如下圖所示:
從上圖中可以看出,name和sex字段上已經建立了一個名為index5_ns的多列索引。
3. 多列索引中,只有查詢條件中使用了這些字段中第一個字段時,索引才會被使用。
先在index5數據表中添加一些數據記錄,然后使用EXPLAIN語句可以查看索引的使用情況。如果只是使用name字段作為查詢條件進行查詢。如下圖所示:
從上圖中可以看出,possible_keys和key的值都是index5_ns。Extra(額外信息)顯示正在使用索引。這說明使用name字段進行索引時,索引index5_ns已經被使用。
4. 如果只使用sex字段作為查詢條件進行查詢。如下圖所示:
從上圖中可以看出,possible_keys和key的值都是NULL。Extra(額外信息)顯示正在使用where條件查詢,而未使用索引。
提示
使用多列索引時一定要特別注意,只有使用了索引中的第一個字段時才會觸發索引。如果沒有使用索引中的第一個字段,那么這個多列索引就不會起作用。因此,在優化查詢速度時,可以考慮優化多列索引。
MySQL創建空間索引
使用SPATIAL參數能夠創建空間索引。創建空間索引時,表的存儲引擎必須是MyISAM類型。而且,索引字段必須有非空約束。
實例:創建一個名為index6的數據表,在表中的space字段上建立名為index6_sp的空間索引。
1. 創建空間索引的SQL代碼如下:
CREATE TABLE index6(id INT, space GEOMETRY NOT NULL, SPATIAL INDEX index6_sp(space)
)ENGINE=MyISAM;
在DOS提示符窗口中查看MySQL創建空間索引的操作效果。如下圖所示:
從上圖可以看出,代碼執行的結果顯示空間索引創建成功。
2. 使用SHOW CREATE TABLE語句可看index6數據表的結構。如下圖所示:
從上圖中可以看出,在space字段上已經建立了一個名為index6_sp的空間索引。
注意,space字段是非空的,而且數據類型是GEOMETRY類型。這個類型是空間數據類型。
空間數據類型包括GEOMETRY、POINT、LINESTRING和POLYGON類型等。這些空間數據類型平時很少用到