mysql - 索引分類 & 建立
阿新 • • 發佈:2021-01-19
一、索引分類:
MySQL目前主要有以下幾種索引型別:
- 普通索引
- 唯一索引
- 主鍵索引
- 組合索引
- 全文索引
二、建表語句:
CREATE TABLE table_name[col_name data type] [unique|fulltext][index|key][index_name](col_name[length])[asc|desc]
- unique | fulltext 為可選引數,分別表示唯一索引、全文索引;
- index 和 key 為同義詞,兩者作用相同,用來指定建立索引;
- col_name為需要建立索引的欄位列,該列必須從資料表中該定義的多個列中選擇;
- index_name
- length為可選引數,表示索引的長度,只有字串型別的欄位才能指定索引長度;
- asc 或 desc 指定升序或降序的索引值儲存。
三、各類索引的建立語句:
普通索引:
- 直接建立:
CREATE INDEX index_name ON table(column(length));
mysql> create index general_index on index_test(title); Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0
- 修改表結構:
ALTER TABLE table_name ADD INDEX index_name (column(length));
mysql> alter table index_test add index general_index1 (title); Query OK, 0 rows affected, 1 warning (0.02 sec) Records: 0 Duplicates: 0 Warnings: 1
- 建表時同時建立索引:
CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(255) CHARACTER NOT NULL , `content` text CHARACTER NULL , `time` int(10) NULL DEFAULT NULL , PRIMARY KEY (`id`), INDEX index_name (title(length)) );
- 刪除索引:
DROP INDEX index_name ON table;
mysql> drop index general_index on index_test; Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0
唯一索引:
簡述:與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引(允許多列欄位),則列值的組合必須唯一。
- 直接建立:
CREATE UNIQUE INDEX index_name ON table(column(length));
- 修改表結構:
ALTER TABLE table_name ADD UNIQUE index_name (column(length));
- 建表時建立:
CREATE TABLE `table_name`( `id` int(11) NOT NULL AUTO_INCREMENT, `title` char(255) NOT NULL, `content` text, `time` int(10) NULL DEFAULT NULL, UNIQUE index_name (title(length)) ) ;
主鍵索引:
簡述:又叫做聚簇索引,是一種特殊的唯一索引,一個表
- 只能有一個主鍵,
- 不允許有空值,
- 允許包含1列或者多列欄位。
- 一般是在建表的時候同時建立主鍵索引;
作用:有了聚簇索引,將來插入的資料行,在同一個區內,都會按照ID值的順序在物理磁碟上有序儲存。
CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(255) NOT NULL , PRIMARY KEY (`id`) );
組合索引(聯合索引):
簡述:指多個欄位上建立的索引,只有在查詢條件中使用了建立索引時的第一個欄位,索引才會被使用。使用組合索引時遵循最左字首集合
- 直接建立:
CREATE INDEX index_name ON table(column_1, colunmn_2, ...);
- 修改表結構:
ALTER TABLE table_name ADD INDEX index_name (column_1, column_2, ...);
mysql> alter table index_test add index joint_index (title, content,c_time); ERROR 1170 (42000): BLOB/TEXT column 'content' used in key specification without a key length mysql> mysql> alter table index_test add index joint_index (title, content(30),c_time); Query OK, 0 rows affected (0.01 sec) Records: 0 Duplicates: 0 Warnings: 0
- 建表時建立:
CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(255) CHARACTER NOT NULL , `content` text CHARACTER NULL , `time` int(10) NULL DEFAULT NULL , PRIMARY KEY (`id`), INDEX index_name (title(length), time) );
全文索引:
簡述:
主要用來查詢文字中的關鍵字,而不是直接與索引中的值相比較。fulltext索引跟其它索引大不相同,它更像是一個搜尋引擎,而不是簡單的where語句的引數匹配。fulltext索引配合match against操作使用,而不是一般的where語句加like。它可以在create table,alter table ,create index使用,不過目前只有char、varchar,text 列上可以建立全文索引。值得一提的是,在資料量較大時候,現將資料放入一個沒有全域性索引的表中,然後再用CREATE index建立fulltext索引,要比先為一張表建立fulltext然後再將資料寫入的速度快很多。
- 建表時建立:
CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(255) CHARACTER NOT NULL , `content` text CHARACTER NULL , `time` int(10) NULL DEFAULT NULL , PRIMARY KEY (`id`), FULLTEXT (content) );
- 直接建立:
CREATE FULLTEXT INDEX index_name ON table(content);
- 修改表:
ALTER TABLE table_name ADD FULLTEXT INDEX index_name (content);
顯示索引資訊:
mysql> show index from table_name\G;