深入學習MySQL——如何創建索引(一),躬身實戰出真知 前言


前言

昨天咱們簡單介紹了MySQL索引的整體概述,讓大家有一個初步的認識。今天,咱們就開始具體實戰:創建MySQL索引。

MySQL支持多種方法在單個或多個列上創建索引:在創建表的定義語句CREATETABLE中指定索引列,使用ALTER TABLE語句在存在的表上創建索引,或者使用CREATE INDEX語句在已存在的表上添加索引。後續咱們將詳細介紹這3種方法。

使用CREATE TABLE創建表時,除了可以定義列的數據類型,還可以定義主鍵約束、外鍵約束或者唯一性約束, 而不論創建那種約束,在定義約束的同時相當於在指定列上創建了一個索引。創建表時創建索引的基本語法格式如下:

UNIQUE、FULLTEXT和SPATIAL爲可選參數,分別表示唯一索引、 全文索引和空間索引; INDEX與KEY爲同義詞,兩者作用相同,用來指定創建索引; col_ name爲需要創建索引的字段列,該列必須從數據表中定義的多個列中選擇; index_ name指定索引的名稱,爲可選參數,如果不指定,MySQL默認col name爲索引值; length 爲可選參數,表示索引的長度,只有字符串類型的字段才能指定索引長度; ASC 或DESC指定升序或者降序的索引值存儲。

創建普通索引

最基本的索引類型,沒有唯一性之類的限制,其作用只是加快對數據的訪問速度。

在book表中的year_ publication 字段上建立普通索引,SQL語句如下:

該語句執行完畢之後,使用SHOW CREATE TABLE查看錶結構:

由結果可以看到,book 表的year_ publication 字段上成功建立索引,其索引名稱year_ publication 爲MySQL自動添加。使用EXPLAIN語句查看索引是否正在使用:

EXPLAIN語句輸出結果的各個行解釋如下:

(1 )select_ type 行指定所使用的SELECT查詢類型,這裏值爲SIMPLE,表示簡單的SELECT, 不使用UNION或子查詢。其他可能的取值有: PRIMARY、UNION、SUBQUERY等。

(2) table 行指定數據庫讀取的數據表的名字,它們按被讀取的先後順序排列。

(3) type行指定了本數據表與其他數據表之間的關聯關係,可能的取值有system、const、eq_ref、ref、range、index和All。

(4) possible_ keys 行給出了MySQL在搜索數據記錄時可選用的各個索引。

(5) key行是MySQL實際選用的索引。

(6) key_ len 行給出索引按字節計算的長度,key_ len 數值越小,表示越快。

(7) ref行給出了關聯關係中另一個數據表裏的數據列的名字。

(8)rows行是MySQL在執行這個查詢時預計會從這個數據表裏讀出的數據行的個數。

(9) extra 行提供了與關聯操作有關的信息。

可以看到,possible_ keys 和key的值都爲year_ publication, 查詢時使用了索引。

創建唯一索引

創建唯一索引的主要原因是減少查詢索引列操作的執行時間,尤其是對比較龐大的數據表。它與前面的普通索引類似,不同的就是:索引列的值必須唯一, 但允許有空值。如果是組合索引,則列值的組合必須唯一。

創建一個表t1,在表中的id字段上使用UNIQUE關鍵字創建唯一索引。

該語句執行完畢之後,使用SHOW CREATE TABLE查看錶結構:

由結果可以看到,id 字段上已經成功建立了一個名爲UniqIdx的唯一索引。

創建單列索引

單列索引是在數據表中的某一個字段上創建的索引,一個表中可以創建多個單列索引。前面兩個例子中創建的索引都爲單列索引。

創建一個表t2,在表中的name字段上創建單列索引。

表結構如下:

該語句執行完畢之後,使用SHOW CREATE TABLE查看錶結構:

由結果可以看到,id 字段上已經成功建立了一個名爲SingleIdx的單列索引,索引長度爲20。

創建組合索引

組合索引是在多個字段上創建一個索引。

創建表t3,在表中的id、name和age字段上建立組合索引,SQL語句如下:

該語句執行完畢之後,使用SHOW CREATE TABLE查看錶結構:

由結果可以看到,id. name 和age字段上已經成功建立了一個名爲Multildx的組合索引。

組合索引可起幾個索引的作用,但是使用時並不是隨便查詢哪個字段都可以使用索引,而是遵從“最左前綴”:利用索引中最左邊的列集來匹配行,這樣的列集稱爲最左前綴。例如這裏由id、name 和age 3個字段構成的索引,索引行中按id/name/age的順序存放,索引可以搜索下面字段組合: (id, name, age)、(id, name)或者id。如果列不構成索引最左面的前綴,MySQL不能使用局部索引,如(age) 或者(name,age) 組合則不能使用索引查詢。

在t3表中,查詢id和name字段,使用EXPLAIN語句查看索引的使用情況:

可以看到,查詢id和name字段時,使用了名稱Multildx的索引,如果查詢(name,age)組合或者單獨查詢name和age字段,結果如下:

此時,possible_ keys 和key值爲NULL,並沒有使用在t3表中創建的索引進行查詢。

創建全文索引

FULLTEXT (全文索引)可以用於全文搜索。只有MyISAM存儲引擎支持FULLTEXT索引,並且只爲CHAR、VARCHAR 和TEXT列創建索引。索引總是對整個列進行,不支持局部(前綴)索引。

創建表t4,在表中的info字段上建立全文索引,SQL語句如下:

因爲MySQL 5.7 中默認存儲引擎爲InnoDB, 在這裏創建表時需要修改表的存儲引擎爲MyISAM,不然創建索引會出錯。

語句執行完畢之後,使用SHOW CREATE TABLE查看錶結構:

由結果可以看到,info 字段上已經成功建立了一個名爲FulTxtldx的FULLTEXT索引。全文索引非常適合於大型數據集,對於小的數據集,它的用處比較小。

創建空間索引

空間索引必須在MyISAM類型的表中創建,且空間類型的字段必須爲非空。

創建表t5,在空間類型爲GEOMETRY的字段上創建空間索引,SQL 語句如下:

可以看到,t5 表的g字段上創建了名稱爲spatIdx的空間索引。注意創建時指定空間類型字段值的非空約束,並且表的存儲引擎爲MyISAM。

今天只是講解了其中一種MySQL索引方式:創建表的時候創建索引,就是希望大家能夠深入理解,每天進步一點點,留給大家充分的自我思考時間,只有這樣,學習思考,才能更好的理解。

喜歡請多多點贊評論分享,關注小編,你們的支持就是小編最大的動力~~~

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