原始出處 http://www.xoops.org/modules/mediawiki/index.php/Dev:MYSQL_indexes
使用資料庫索引(index)可以加快資料查詢速度。如果沒有索引的話,MYSQL 就必須從表格第一行開始讀取然後讀完整個表格找出相關的資料。越大的表格等待的時間就越久。使用索引的話,MySQL 就可以很快的決定開始查詢的位置而不必找整個表格。這樣子可以減少許多查詢時間,也就是代表你的網頁可以更快的出現。
何時使用索引
索引可以增加SELECT 查詢找出符合WHERE 條件式與ORDER BY 子句的效能。如果主鍵是子句中唯一欄位的話你就不需要使用索引了,表格會預設依主鍵排序。如果你多數的時候是查詢一個非主鍵的欄位或是多個欄位的話,或許你就應該考慮使用索引了。
使用哪些欄位做為索引
使用索引時先想到最常在查詢式中使用到的欄位,並且先為這些欄位做索引。
舉例來說如果col_3 是查詢最常使用的欄位的話就要使用CREATE INDEX example_index (col_3);。
如果最常查詢某個欄位加上其他欄位的話,也將那些其他的欄位做索引,將那些其他的欄位做為索引的其他鍵值。
舉例來說CREATE INDEX example_index (col_3, col_5, col_6);。
建立索引鍵值時最常使用的欄位應該放在左邊,讓相同的索引可以做為部分鍵(patial key)。舉例來說,上面的例子的索引可以是(col_3),(col_3 and col_5)與(col_3, col_5 and col_6)。
所以SELECT * FROM example_table WHERE col_3=val1 AND col_5=val2; 就會使用到索引。
而SELECT * FROM example_table WHERE col_6=val; 不會使用到索引,因為col_6 不符合索引的最左邊鍵值。
使用索引的缺點
MySQL 將原始資料與索引資料存放在不同的檔案。所以當你新增索引都會增加資料庫的檔案大小。分開儲存可以加快資料取得,但是當使用INSERT、UPDATE,或DELETE 敘述句更改資料庫時會減緩資料儲存。
所以在建立索引前仔細考慮是否會經常使用這個索引,並且建立你真正需要使用的索引。
建立一個索引的資料表
在mysql.sql 檔案中你可以同時建立表格與索引。MySQL 可以使用兩種指令建立索引:KEY 與INDEX。這兩種指令有相同的功能。
範例:
CREATE TABLE `example_table` (
`eg_id` int(12) unsigned NOT NULL auto_increment,
`eg_integer` int(10) unsigned NOT NULL default '0',
`eg_string` char(100) NOT NULL default ,
`eg_date` int(12) unsigned NOT NULL default '0',
PRIMARY KEY (`eg_id`),
KEY `eg_date` (`eg_date`,`eg_string`),
KEY `eg_integer` (`eg_integer`)
) TYPE=MyISAM;
CREATE TABLE `example_table` (
`eg_id` int(12) unsigned NOT NULL auto_increment,
`eg_integer` int(10) unsigned NOT NULL default '0',
`eg_string` char(100) NOT NULL default ,
`eg_date` int(12) unsigned NOT NULL default '0',
PRIMARY KEY (`eg_id`),
INDEX `eg_date` (`eg_date`,`eg_string`),
INDEX `eg_integer` (`eg_integer`)
) TYPE=MyISAM;
所有類型的欄位都可以做索引,但是當對BLOB 或TEXT 類型的欄位做索引時你必須標示長度。舉例來說:
CREATE TABLE test (
text_col text,
INDEX (text_col(10))
) TYPE=MyISAM;
為已存在的表格做索引
例如:
ALTER TABLE example_table
ADD INDEX [index_name] (index_col_name,...)
參考:
MySQL Documentation: