MySQL索引介紹,普通索引,全文索引,空間索引,多列索引使用原則,建立索引常用的規則

轉自:https://blog.csdn.net/tomorrow_fine/article/details/78337735

1.MySQL在創建數據表的時候創建索引

在MySQL中創建表的時候,可以直接創建索引。基本的語法格式如下:

CREATE TABLE 表名(字段名 數據類型 [完整性約束條件],
                  [UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY
                  [索引名](字段名1 [(長度)] [ASC | DESC])
);

UNIQUE: 可選。表示索引爲唯一性索引。
FULLTEXT; 可選。表示索引爲全文索引。
SPATIAL: 可選。表示索引爲空間索引。
INDEX和KEY: 用於指定字段爲索引,兩者選擇其中之一就可以了,作用是一樣的。
索引名: 可選。給創建的索引取一個新名稱。
字段名1: 指定索引對應的字段的名稱,該字段必須是前面定義好的字段。
長度: 可選。指索引的長度,必須是字符串類型纔可以使用。
ASC: 可選。表示升序排列。
DESC: 可選。表示降序排列。

1.1 MySQL創建普通索引

創建一個普通索引時,不需要加任何UNIQUE、FULLTEXT或者SPATIAL參數。

實例:創建一個名爲index1的數據表,在表內的id字段上建立一個普通索引。

1. 創建普通索引的SQL代碼如下:

CREATE TABLE index1(id INT,
    name VARCHAR(20),
    sex BOOLEAN,
    INDEX(id)
); 

查看MySQL創建普通索引的操作效果。如下圖所示:
在這裏插入圖片描述
從上圖中可以看出,運行結果顯示普通索引創建成功。

2. 使用SHOW CREATE TABLE語句查看錶的結構。如下圖所示:
或者通過1步驟,可以看出,在id字段上已經建立了一個名爲id的普通索引。語句:

KEY `id` (`id`)

圓括號內的id是字段名稱,圓括號左側外面的id是索引名稱。

3. 使用EXPLAIN語句查看索引是否被使用。SQL代碼如下:

  EXPLAIN SELECT * FROM index1 WHERE id = 1;

使用EXPLAIN語句查看索引是否被使用的操作效果。如下圖所示:
在這裏插入圖片描述

上圖中的結果顯示,possible_keys和key的值都爲id。說明id索引已經存在,並且查詢時已經使用了索引。

1.2 MySQL創建唯一性索引

如果使用UNIQUE參數進行約束,則可以創建唯一性索引。

實例:創建一個名爲index2的數據表,在表內的id字段上建立一個唯一性索引,並且設置id字段以升序的形式排列。
1. 創建一個唯一性索引的SQL代碼如下:

CREATE TABLE index2(
id INT UNIQUE,
NAME VARCHAR(20),
UNIQUE INDEX index2_id(id ASC)
);

index2_id是爲唯一性索引起的一個新名字。

查看MySQL創建唯一性索引的操作效果。如下圖所示:
在這裏插入圖片描述
從上圖中可以看出,運行結果顯示創建成功。

2. 使用SHOW CREATE TABLE語句查看錶的結構。SQL代碼如下:

SHOW CREATE TABLE index2 \G
在DOS提示符窗口中查看使用SHOW CREATE TABLE語句查看錶的結構的效果。也可以通過上面的1步驟看到,在id字段上建立了名爲id和index2_id的兩個唯一性索引。這樣做,可以提高數據的查詢速度。

如果在創建index2表時,id字段沒有進行唯一性結束。如下所示:

CREATE TABLE index2(
id INT,
name VARCHAR(20),
UNIQUE INDEX index2_id(id ASC)
);

則也可以在id字段上成功創建名爲index2_id的唯一性索引。但是,這樣可能達不到提高查詢速度的目的。

1.3 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存儲引擎上創建全文索引。

查看MySQL創建全文索引的操作效果。如下圖所示:
在這裏插入圖片描述

從上圖中可以看出,代碼的執行結果顯示創建成功。

2. 使用SHOW CREATE TABLE語句查看index3數據表的結構。如下圖所示:
從上圖中可以看出,在info字段上已經建立了一個名爲index3_info的全文索引。
注意
我使用的是MySQL 5.6.19版本,已經可以在InnoDB存儲引擎中創建全文索引了。

全文索引非常適合於大型數據集,對於小的數據集,它的用處可能比較小。

1.4 MySQL創建單列索引

單列索引是在數據表的單個字段上創建的索引。一個表中可以創建多個單列索引。唯一性索引和普通索引等都爲單列索引。

實例:創建一個名爲index4的數據表,在表中的subject字段上建立名爲index4_st的單列索引。

1. 創建單列索引的SQL代碼如下:

CREATE TABLE index4(
id INT,
subject VARCHAR(30),
INDEX index4_st(subject(10))
);

查看MySQL創建單列索引的操作效果。如下圖所示:
在這裏插入圖片描述

從上圖中可以看出,代碼執行的結果顯示創建成功。

2. 使用SHOW CREATE TABLE語句 或 manage index 查看index4數據表的結構。如下圖所示:
在這裏插入圖片描述

從上圖中可以看出,在subject字段上已經建立了一個名爲index4_st的單列索引。

注意:subject字段長度爲30,而index4_st設置的索引長度只有10,這樣做是爲了提高查詢速度。對於字符型的數據,可以不用查詢全部信息,而只查詢它前面的若干字符信息。

1.5 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索引創建成功。

從上圖中可以看出,name和sex字段上已經建立了一個名爲index5_ns的多列索引。

2. 多列索引中,只有查詢條件中使用了這些字段中第一個字段時,索引纔會被使用。

先在index5數據表中添加一些數據記錄,然後使用EXPLAIN語句可以查看索引的使用情況。如果只是使用name字段作爲查詢條件進行查詢。如下圖所示:
在這裏插入圖片描述

EXPLAIN SELECT id,NAME,sex FROM index5;

在這裏插入圖片描述

EXPLAIN SELECT id,NAME,sex FROM index5 WHERE id = 3;
在這裏插入圖片描述

在這裏插入圖片描述

從上圖中可以看出,possible_keys和key的值都是index5_ns。Extra(額外信息)顯示正在使用索引。這說明使用name字段進行索引時,索引index5_ns已經被使用。

4. 如果只使用sex字段作爲查詢條件進行查詢。如下圖所示:

EXPLAIN SELECT id,NAME,sex FROM index5 WHERE sex = '女';

在這裏插入圖片描述

從上圖中可以看出,possible_keys和key的值都是NULL。Extra(額外信息)顯示正在使用where條件查詢,而未使用索引。

提示

使用多列索引時一定要特別注意,只有使用了索引中的第一個字段時纔會觸發索引。如果沒有使用索引中的第一個字段,那麼這個多列索引就不會起作用。因此,在優化查詢速度時,可以考慮優化多列索引。

1.5 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創建空間索引的操作效果。如下圖所示:
在這裏插入圖片描述

從上圖可以看出,代碼執行的結果顯示空間索引創建成功。

  1. 使用SHOW CREATE TABLE語句可看index6數據表的結構。如下圖所示:
    從上圖中可以看出,在space字段上已經建立了一個名爲index6_sp的空間索引。從上圖中可以看出,在space字段上已經建立了一個名爲index6_sp的空間索引。

注意,space字段是非空的,而且數據類型是GEOMETRY類型。這個類型是空間數據類型。

空間數據類型包括GEOMETRY、POINT、LINESTRING和POLYGON類型等。這些空間數據類型平時很少用到

2 添加索引

1.添加PRIMARY KEY(主鍵索引)
mysql>ALTER TABLE table_name ADD PRIMARY KEY ( column )
2.添加UNIQUE(唯一索引)
mysql>ALTER TABLE table_name ADD UNIQUE (
column
)
3.添加INDEX(普通索引)
mysql>ALTER TABLE table_name ADD INDEX index_name ( column )
4.添加FULLTEXT(全文索引)
mysql>ALTER TABLE table_name ADD FULLTEXT ( column)
5.添加多列索引
mysql>ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3 )

3 建立索引常用的規則

轉:https://www.cnblogs.com/JimLy-BUG/p/6812682.html
建立索引常用的規則如下:
1、表的主鍵、外鍵必須有索引;
2、數據量超過300萬的表應該有索引;
3、經常與其他表進行連接的表,在連接字段上應該建立索引;
4、經常出現在Where子句中的字段,非凡是大表的字段,應該建立索引;
5、索引應該建在選擇性高的字段上(枚舉型字段不建索引);
6、索引應該建在小字段上,對於大的文本字段甚至超長字段,不要建索引;
7、複合索引的建立需要進行仔細分析;儘量考慮用單字段索引代替:
A、正確選擇複合索引中的主列字段,一般是選擇性較好的字段;
B、複合索引的幾個字段是否經常同時以AND方式出現在Where子句中?單字段查詢是否極少甚至沒有?假如是,則可以建立複合索引;否則考慮單字段索引;
C、假如複合索引中包含的字段經常單獨出現在Where子句中,則分解爲多個單字段索引;
D、假如複合索引所包含的字段超過3個,那麼仔細考慮其必要性,考慮減少複合的字段;
E、假如既有單字段索引,又有這幾個字段上的複合索引,一般可以刪除複合索引;
8、頻繁進行數據操作的表,不要建立太多的索引;
9、刪除無用的索引,避免對執行計劃造成負面影響;
以上是一些普遍的建立索引時的判定依據。一言以蔽之,索引的建立必須慎重,對每個索引的必要性都應該經過仔細分析,要有建立的依據。因爲太多的索引與不充分、不正確的索引對性能都毫無益處:在表上建立的每個索引都會增加存儲開銷,索引對於插入、刪除、更新操作也會增加處理上的開銷。另外,過多的複合索引,在有單字段索引的情況下,一般都是沒有存在價值的;相反,還會降低數據增加刪除時的性能,凡是對頻繁更新的表來說,負面影響更大

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章