MYSQL 索引

日期 2010年08月12日 21:50:00 | 新聞類別: 模組開發

原始出處 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:

Column Indexes

Multiple-Column Indexes

How MySQL Uses Indexes





本篇新聞來自:XOOPS Site
https://www.xoops.org.tw

本篇新聞的連結網址是:
https://www.xoops.org.tw/modules/news/article.php?storyid=11