索引是一種特殊的資料庫結構,可以用來快速查詢資料庫表中的特定記錄。索引是提高資料庫性能的重要方式。MySQL中,所有的資料類型都可以被索引。MySQL的索引包括普通索引、唯一性索引、全文索引、單列索引、多列索引和空間索引等。
索引是一種将資料庫中單列或者多列的值進行排序的結構。應用索引,可以大幅度提高查詢的速度。使用者通過索引查詢資料,不但可以提高查詢速度,也可以降低伺服器的負載。使用者查詢資料時,系統可以不必周遊資料表中的所有記錄,而隻需查詢索引列。一般過程的資料查詢是通過周遊全部資料,并尋找資料庫中的比對記錄而實作的。與一般形式的查詢相比,索引就像一本書的目錄。而當使用者通過索引查找資料時,就好比使用者通過目錄查詢某章節的某個知識點。這樣就幫助使用者有效地提高了查找速度。是以,使用索引可以有效地提高資料庫系統的整體性能。
應用MySQL資料庫時,并非使用者在查詢資料的時候總需要應用索引來優化查詢。凡事都有兩面性,使用索引可以提高檢索資料的速度,但是,建立和維護索引需要耗費時間,并且該耗費時間與資料量的大小成正比;另外,索引需要占用實體空間,給資料的維護帶來很多麻煩。
整體來說,索引可以提高查詢的速度,但是會影響使用者的插入操作。因為,向有索引的表中插入記錄時,資料庫系統會按照索引進行排序。是以,使用者可以将索引删除後,插入資料,當資料插入操作完成後,使用者可以重新建立索引。
不同的存儲引擎定義每個表的最大索引數和最大索引長度。所有存儲引擎對每個表至少支援16個索引,總索引長度至少為256位元組。有些存儲引擎支援更多的索引數和更大的索引長度。索引有兩種存儲類型,包括B型樹(BTREE)索引和哈希(HASH)索引。其中B型樹為系統預設索引方法。
普通索引,即不應用任何限制條件的索引,該索引可以在任何資料類型中建立。字段本身的限制條件可以判斷其值是否為空或唯一。建立該類型索引後,使用者便可以通過索引進行查詢。
唯一索引,使用UNIQUE參數可以設定唯一索引。建立該索引時,索引的值必須唯一,通過唯一索引,使用者可以快速地定位某條記錄,主鍵是一種特殊的唯一索引。
全文索引,使用FULLTEXT參數可以設定索引為全文索引。全文索引隻能建立在CHAR、VARCHAR或者TEXT類型的字段上。查詢資料量較大的字元串類型的字段時,使用全文索引可以提高查詢速度。例如,查詢帶有文章回複内容的字段。可以應用全文索引方式。需要注意的是,在預設情況下,應用全文索引大小寫不敏感。如果索引的列使用二進制排序,則可以執行大小寫敏感的全文索引。
單列索引即隻對應一個字段的索引。其可以包括上述叙述的三種索引方式。應用該索引的條件隻需要保證該索引值對應一個字段即可。
多列索引是在表的多個字段上建立一個索引。該索引指向建立時對應的多個字段,使用者可以通過這幾個字段進行查詢。要想應用該索引,使用者必須使用這些字段中第一個字段。
空間索引使用SPATIAL參數可以設定索引為空間索引。空間索引隻能建立在空間資料類型上,這樣可以提高系統擷取空間資料的效率。MySQL中隻有MyISAM存儲引擎支援空間檢索,而且索引的字段不能為空值。
參數含義如下:
UNIQUE:可選參數,表明索引為唯一性索引。
FULLTEXT:可選參數,表明索引為全文搜尋。
SPATIAL:可選參數,表明索引為空間索引。
INDEX和KEY參數用于指定字段索引,使用者在選擇時,隻需要選擇其中的一種即可。另外别名為可選參數,其作用是給建立的索引命名新名稱。
屬性名1:指索引對應的字段名稱,該字段必須被預先定義。
長度:可選參數,指索引的長度,必須是字元串類型才可以使用。
ASC/DESC:可選參數,ASC表示升序排列,DESC表示降序排列。
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name ON table_name (屬性[(length)] [ASC|DESC]);
指令的參數說明如下:
index_name為索引名稱,該參數作用是給使用者建立的索引賦予新的名稱。
table_name為表名,即指定建立索引的表名稱。
length為可選參數,用于指定索引長度。
ASC和DESC參數,指定資料表的排序順序。
與在建立資料表時建立索引相同,在已建立的資料表中建立索引同樣包含6種索引方式。
普通索引 CREATE INDEX stu_info ON studentinfo (sid);
唯一索引 CREATE UNIQUE INDEX index1_id ON index1 (cid);
全文索引 CREATE FULLTEXT INDEX index2_info ON index2 (info);
單列索引 CREATE INDEX index3_addr ON index3 (address (4));
多列索引 CREATE INDEX index4_na ON index4 (name, address);
空間索引 CREATE SPATIAL INDEX 索引名 ON 資料表名稱 (字段名稱);
修改已經存在的表上的索引可以通過ALTERTABLE語句為資料表添加索引,其基本結構如下:
ALTER TABLE table_name ADD [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name (屬性名[(length)][ASC|DESC]);
alter table studentinfo ADD INDEX timer (time (20)):
在MySQL中,建立索引後,如果使用者不再需要該索引,則可以删除指定表的索引。因為這些已經被建立且不常使用的索引,一方面可能會占用系統資源,另一方面也可能導緻更新速度下降,這極大地影響了資料表的性能。是以,在使用者不需要該表的索引時,可以手動删除指定索引。删除索引可以通過DROP語句來實作
DROP INDEX index_name ON table_name;
其中,參數index_name是使用者需要删除的索引名稱,參數table_name指定資料表名稱。