MySQL學習之(七)索引
索引 —— 是一種提高查詢速度的機制
索引用來快速地尋找那些具有特定值的記錄,如果沒有索引,執行查詢時MySQL必須從第一個記錄開始掃描整個表的所有記錄,直至找到符合要求的記錄。表裡面的記錄數量越多,這個操作的代價就越高。
索引提供指標以指向儲存在表中指定列的資料值,然後根據指定的排序次序排列這些指標。資料庫使用索引的方式與使用書的目錄很相似:通過搜尋索引找到特定的值,然後跟隨指標到達包含該值的行。
如果作為搜尋條件的列上已經建立了索引,MySQL無需掃描任何記錄即可迅速得到目標記錄所在的位置。如果表有1000個記錄,通過索引查詢記錄至少要比順序掃描記錄快100倍。
1.索引機制
學生表student中建立“學號”索引(升序)示意圖
沒有索引檔案時:
如果要找位於第10000條的學號”20070201”的記錄, 計算機要在表中查詢10000次
有索引檔案時:(二分法查詢例項)
計算機先在索引檔案中學號為”20070201”的記錄,找到相應的記錄號,再到學生表中直接讀取相關記錄.
索引檔案如何加快查詢速度?
原因:
(1)索引後,指標在索引檔案中順序移動。
(2)索引檔案中記錄是有序的。
(3)有序後,可以用各種方法加快查詢速度,如折半(二分)查詢法,而排序前,只能順序查詢記錄。
樹索引示意圖
2.索引的分類
1. 普通索引(INDEX)
這是最基本的索引型別,它沒有唯一性之類的限制。建立普通索引的關鍵字是INDEX。
2. 唯一性索引(UNIQUE)
這種索引和前面的普通索引基本相同,但有一個區別:索引列的所有值都只能出現一次,即必須是唯一的。建立唯一性索引的關鍵字是UNIQUE。
3. 主鍵(PRIMARY KEY)
主鍵是一種唯一性索引,它必須指定為“PRIMARY KEY”。主鍵一般在建立表的時候指定,也可以通過修改表的方式加入主鍵。但是每個表只能有一個主鍵。
4. 全文索引(FULLTEXT)
MySQL支援全文檢索和全文索引。全文索引的索引型別為FULLTEXT。全文索引只能在VARCHAR或TEXT型別的列上建立,並且只能在MyISAM表中建立。
3、索引建立
①使用CREATE INDEX語句
使用CREATE INDEX語句可以在一個已有表上建立索引,一個表可以建立多個索引。
語法格式:
CREATE [UNIQUE | FULLTEXT] INDEX 索引名
ON 表名(列名[(length)] [ASC | DESC],...)
說明:
●索引名:索引的名稱,索引名在一個表中名稱必須是唯一的。
● 列名:表示建立索引的列名。
length表示使用列的前length個字元建立索引。使用列的一部分建立索引可以使索引檔案大大減小,從而節省磁碟空間。BLOB或TEXT列必須用字首索引。
● UNIQUE:UNIQUE表示建立的是唯一性索引
● FULLTEXT:FULLTEXT表示建立全文索引;
● CREATE INDEX 語句並不能建立主鍵。
例:
根據Book表的書名列上的前6個字元建立一個升序索引name_book。
CREATE INDEX name_book
ON Book(書名(6) ASC);
可以在一個索引的定義中包含多個列,中間用逗號隔開,但是它們要屬於同一個表。這樣的索引叫做複合索引。
②使用ALTER TABLE語句
使用ALTER TABLE語句修改表,其中也包括向表中新增索引。
語法格式如下:
ALTER TABLE 表名
ADD INDEX [索引名] (列名,...) /*新增索引*/
| ADD PRIMARY KEY [索引方式] (列名,...) /*新增主鍵*/
| ADD UNIQUE [索引名] (列名,...) /*新增唯一性索引*/
| ADD FULLTEXT [索引名] (列名,...) /*新增全文索引*/
例:
假設Book表中主鍵未設定,為Book表建立以圖書編號為主鍵索引,出版社和出版時間為複合索引,以加速表的檢索速度。
ALTER TABLE Book
ADD PRIMARY KEY(圖書編號),
ADD INDEX mark(出版社,出版時間);
這個例子中,既包括PRIMARY KEY,也包括複合索引,說明MySQL可以同時建立多個索引。記住,使用PRIMARY KEY的列,必須是一個具有NOT NULL屬性的列。
如果想要查看錶中建立的索引的情況,可以使用SHOW INDEX FROM tbl_name語句,例如:SHOW INDEX FROM book;
③建立表時建立索引
在前面兩種情況下,索引都是在表建立之後建立的。索引也可以在建立表時一起建立。在建立表的CREATE TABLE語句中可以包含索引的定義。
語法格式:
CREATE TABLE 表名 ( 列名, ... | [索引項])
其中,索引項語法格式如下:
PRIMARY KEY (列名,...) /*主鍵*/
| {INDEX | KEY} [索引名] (列名,...) /*索引*/
| UNIQUE [INDEX] [索引名] (列名,...) /*唯一性索引*/
| [FULLTEXT] [INDEX] [索引名] (列名,...) /*全文索引*/
說明:KEY通常是INDEX的同義詞。在定義列選項的時候,也可以將某列定義為PRIMARY KEY,但是當主鍵是由多個列組成的多列索引時,定義列時無法定義此主鍵,必須在語句最後加上一個PRIMARY KEY列名,…)子句。
例:
建立sell_copy表的語句如下,sell_copy錶帶有身份證號和圖書編號的聯合主鍵,並在訂購冊數列上建立索引。
CREATE TABLE sell_copy (
身份證號 CHAR(18) NOT NULL,
圖書編號 CHAR(20) NOT NULL,
訂購冊數 INT(5),
訂購時間 DATETIME
,PRIMARY KEY(身份證號, 圖書編號),
INDEX dgcs(訂購冊數)
);
4、刪除索引
①使用DROP INDEX語句刪除索引
語法格式:
DROP INDEX索引名 ON 表名
例:
刪除Book表上的sm_book索引。
DROP INDEX sm_book ON Book;
②使用ALTER TABLE語句刪除索引
語法格式:
ALTER [IGNORE] TABLE 表名
| DROP PRIMARY KEY /*刪除主鍵*/
| DROP INDEX 索引名 /*刪除索引*/
【例】刪除Book表上的主鍵和mark索引。
ALTER TABLE Book
DROP PRIMARY KEY,
DROP INDEX mark;
如果從表中刪除了列,則索引可能會受到影響。如果所刪除的列為索引的組成部分,則該列也會從索引中刪除。如果組成索引的所有列都被刪除,則整個索引將被刪除。
5.索引的弊端
首先,索引是以檔案的形式儲存的,索引檔案要佔用磁碟空間。如果有大量的索引,索引檔案可能會比資料檔案更快地達到最大的檔案尺寸。
其次,在更新表中索引列上的資料時,對索引也需要更新,這可能需要重新組織一個索引,如果表中的索引很多,這是很浪費時間的。也就是說,這樣就降低了新增、刪除、修改和其他寫入操作的效率。表中的索引越多,則更新表的時間就越長。
但是這些弊端並不妨礙索引的應用,因為索引帶來的好處已經基本掩蓋了它的缺陷,在表中有很多行資料的時候,索引通常是不可缺少的。