八、MySQL索引
索引用於快速找出在某個列中有一特定值的列。不使用索引,MySQL必須從第一條記錄開始讀完整個表,直到找出相關的行。表越大,查詢資料所花費的時間越多。如果表中查詢的列有一個索引,MySQL能快速到達某個位置去搜尋資料檔案,而不必檢視所有資料。
一、索引簡介
索引是對資料表中一列或多列的值進行排序的一種結構,使用索引可提高資料庫中特定資料的查詢速度。
1.1 索引的含義和特點
索引是一個單獨的、儲存在磁碟上的資料庫結構,它們包含著對資料表裡所有記錄的引用指標。使用索引用於快速找出某個或多個列中有一特定值的行,所有MySQL列型別都可以被索引,對相關列使用索引是提高查詢操作速度的最佳途徑。
例如:資料庫中有兩萬條記錄,現在要執行這樣一個查詢:SELECT * FROM table WHERE num=10000。如果沒有索引,必須遍歷整個表,直到num=10000這一行被找到為止;如果在num列上建立索引,MySQL不需要任何掃描,直接在索引裡面找10000,就可以得知這一行的位置。可見,索引的建立可以提高資料庫的查詢速度。
索引是在儲存引擎中實現的,因此,每種儲存引擎的索引都不一定相同,並且每種儲存引擎也不一定支援所有索引型別。根據儲存引擎定義每個表的最大索引數和最大索引長度。所有儲存引擎支援每個表最少16個索引,總索引長度至少為256位元組。大多數儲存引擎有更高的限制。MySQL中索引的儲存型別有兩種:BTREE和HASH,具體和表的儲存引擎相關;MyISAM和InnoDB儲存引擎只支援BTREE索引;MEMORY/HEAP儲存引擎可以支援HASH和BTREE索引。
索引的優點主要有以下幾條:
(1)通過建立唯一索引,可以保證資料庫表中每一行資料的唯一性。
(2)可以大大加快資料的查詢速度,這也是建立索引的最主要的原因。
(3)在實現資料的參考完整性方面,可以加速表和表之間的連線。
(4)在使用分組和排序子句進行資料查詢時,也可以顯著減少查詢中分組和排序的時間。
增加索引也有許多不利,主要表現在以下幾個方面:
(1)建立索引和維護索引要耗費時間,並且隨著資料量的增加所耗費的時間也會增加。
(2)索引需要佔磁碟空間,除了資料表佔資料空間外,每一個索引還要佔一定的物理空間,如果有大量的索引,索引檔案可能比資料檔案更快達到最大檔案尺寸。
(3)當對錶中資料進行增加、刪除和修改的時候,索引也要動態的維護,這樣就降低了資料的維護速度。
1.2 索引的分類
MySQL的索引可以分為以下幾類:
1.2.1 普通索引和唯一索引
普通索引是MySQL中的基本索引型別,允許在定義索引的列中插入重複值和空值。
唯一索引,索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。主鍵索引是一種特殊的唯一索引,不允許有空值。
1.2.2 單列索引和組合索引
單列索引即一個索引只包含單個列,一個表可以有多個單列索引。
組合索引指在表的多個欄位組合上建立的索引,只有在查詢條件中使用了這些欄位的左邊欄位時,索引才會被使用。使用組合索引時遵循最左字首集合。
1.2.3 全文索引
全文索引型別為FULLTEXT,在定義索引的列上支援值的全文查詢,允許在這些索引列中插入重複值和空值。全文索引可以在CHAR,VARCHAR或者TEXT型別的列上建立。MySQL中只有MyISAM儲存引擎支援全文索引。
1.2.4 空間索引
空間索引是對空間資料型別的欄位建立的索引,MySQL中的空間資料型別有4種,分別是:GEOMETRY、POINT、LINESTRING和POLYGON。MySQL使用SPATIAL關鍵字進行擴充套件,使得能夠用於建立正規索引類似的語法建立空間索引。建立空間索引的列,必須將其宣告為NOT NULL,空間索引只能在儲存引擎為MyISAM的表中建立。
1.3 索引的設計原則