CREATE TABLE table_name[col_name data type]
[unique|fulltext|spatial][index|key][index_name](col_name[length])[asc|desc]
1、unique|fulltext|spatial為可選參數,分別表示唯一索引、全文索引和空間索引;
2、index和key為同義詞,兩者作用相同,用來指定創建索引
3、col_name為需要創建索引的字段列,該列必須從數據表中該定義的多個列中選擇;
4、index_name指定索引的名稱,為可選參數,如果不指定,MYSQL默認col_name為索引值;
5、length為可選參數,表示索引的長度,只有字符串類型的字段才能指定索引長度;
6、asc或desc指定升序或降序的索引值存儲
一、索引
MySQL索引的建立對於MySQL的高效運行是很重要的,索引可以大大提高MySQL的檢索速度。
打個比方,如果合理的設計且使用索引的MySQL是一輛蘭博基尼的話,那么沒有設計和使用索引的MySQL就是一個人力三輪車。
索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索引包含多個列。
創建索引時,你需要確保該索引是應用在 SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。
實際上,索引也是一張表,該表保存了主鍵與索引字段,並指向實體表的記錄。
上面都在說使用索引的好處,但過多的使用索引將會造成濫用。因此索引也會有它的缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件。
建立索引會占用磁盤空間的索引文件。
二、索引類型
Mysql目前主要有以下幾種索引類型:FULLTEXT,HASH,BTREE,RTREE。
1. FULLTEXT
即為全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不過目前只有 CHAR、VARCHAR ,TEXT 列上可以創建全文索引。
全文索引並不是和MyISAM一起誕生的,它的出現是為了解決WHERE name LIKE “%word%"這類針對文本的模糊查詢效率較低的問題。
2. HASH
由於HASH的唯一(幾乎100%的唯一)及類似鍵值對的形式,很適合作為索引。
HASH索引可以一次定位,不需要像樹形索引那樣逐層查找,因此具有極高的效率。但是,這種高效是有條件的,即只在“=”和“in”條件下高效,對於范圍查詢、排序及組合索引仍然效率不高。
3. BTREE
BTREE索引就是一種將索引值按一定的算法,存入一個樹形的數據結構中(二叉樹),每次查詢都是從樹的入口root開始,依次遍歷node,獲取leaf。這是MySQL里默認和最常用的索引類型。
4. RTREE
RTREE在MySQL很少使用,僅支持geometry數據類型,支持該類型的存儲引擎只有MyISAM、BDb、InnoDb、NDb、Archive幾種。
相對於BTREE,RTREE的優勢在於范圍查找。
ps. 此段詳細內容見此片博文:Mysql幾種索引類型的區別及適用情況
三、索引種類
普通索引:僅加速查詢
唯一索引:加速查詢 + 列值唯一(可以有null)
主鍵索引:加速查詢 + 列值唯一(不可以有null)+ 表中只有一個
組合索引:多列值組成一個索引,專門用於組合搜索,其效率大於索引合並
全文索引:對文本的內容進行分詞,進行搜索
ps.
索引合並,使用多個單列索引組合搜索
覆蓋索引,select的數據列只用從索引中就能夠取得,不必讀取數據行,換句話說查詢列要被所建的索引覆蓋
四、操作索引
1. 創建索引
--創建普通索引CREATE INDEX index_name ON table_name(col_name);
--創建唯一索引CREATE UNIQUE INDEX index_name ON table_name(col_name);
--創建普通組合索引CREATE INDEX index_name ON table_name(col_name_1,col_name_2);
--創建唯一組合索引CREATE UNIQUE INDEX index_name ON table_name(col_name_1,col_name_2);
2. 通過修改表結構創建索引
ALTER TABLE table_name ADD INDEX index_name(col_name);
3. 創建表時直接指定索引
CREATE TABLE table_name ( ID INT NOT NULL,col_name VARCHAR (16) NOT NULL,INDEX index_name (col_name) );
4. 刪除索引
--直接刪除索引DROP INDEX index_name ON table_name;
--修改表結構刪除索引ALTER TABLE table_name DROP INDEX index_name;
5. 其它相關命令
- 查看表結構 desc table_name; - 查看生成表的SQL show create table table_name; - 查看索引 show index from table_name; - 查看執行時間 set profiling = 1; SQL... show profiles;
其它注意事項
- 避免使用select *- count(1)或count(列) 代替 count(*)
- 創建表時盡量時 char 代替 varchar- 表的字段順序固定長度的字段優先
- 組合索引代替多個單列索引(經常使用多個條件查詢時)- 盡量使用短索引
- 使用連接(JOIN)來代替子查詢(Sub-Queries)
- 連表時注意條件類型需一致- 索引散列值(重復多)不適合建索引,例:性別不適合