索引是加速表內容訪問的主要手段,特別對涉及多個表的串連的查詢更是如此。這是資料庫最佳化中的一個重要內容,我們要瞭解為什麼需要索引,索引如何工作以及怎樣利用它們來最佳化查詢。本節中,我們將介紹索引的特點,以及建立和刪除索引的文法。
索引的特點
所有的MySQL列類型能被索引。在相關的列上的使用索引是改進SELECT操作效能的最好方法。
一個表最多可有16個索引。最大索引長度是256個位元組,儘管這可以在編譯MySQL時被改變。
對於CHAR和VARCHAR列,你可以索引列的首碼。這更快並且比索引整個列需要較少的磁碟空間。對於BLOB和TEXT列,你必須索引列的首碼,你不能索引列的全部。
MySQL能在多個列上建立索引。一個索引可以由最多15個列組成。在CHAR和VARCHAR列上,你也可以使用列的首碼作為一個索引的部分)。
雖然隨著 MySQL 的進一步開發建立索引的約束將會越來越少,但現在還是存在一些約束的。下面的表根據索引的特性,給出了 ISAM 表和 MyISAM 表之間的差別:
表2-1 通道資訊特徵字對照表
索引的特點 |
ISAM 表 |
MyISAM 表 |
NULL 值 BLOB 和 TEXT 列 每個表中的索引數 每個索引中的列數 最大索引行尺寸 |
不允許 不能索引 16 16 256 位元組 |
允許 只能索引列的首碼 32 16 500 位元組 |
從此表中可以看到,對於 ISAM 表來說,其索引列必須定義為 NOT NULL,並且不能對 BLOB 和 TEXT 列進行索引。MyISAM 表類型去掉了這些限制,而且減緩了其他的一些限制。兩種表類型的索引特性的差異表明,根據所使用的 MySQL 版本的不同,有可能對某些列不能進行索引。例如,如果使用3.23 版以前的版本,則不能對包含 NULL 值的列進行索引。
索引有如下的幾種情況:
INDEX索引:通常意義的索引,某些情況下KEY是它的一個同義字。索引的列可以包括重複的值。
UNIQUE索引:唯一索引,保證了列不包含重複的值,對於多列唯一索引,它保證值的組合不重複。
PRIMARY KEY索引:也UNIQUE索引非常類似。事實上,PRIMARY KEY索引僅是一個具有PRIMARY名稱的UNIQUE索引。這表示一個表只能包含一個PRIMARY KEY。