最常見的索引類型涉及單一資料行,將該資料行的值副本儲存在資料結構中,以快速查找具有對應資料行值的資料列。 B 樹資料結構可讓索引快速找到特定值、一組值或一系列值,對應於 =、>、≤、BETWEEN、IN 等運算子(在 WHERE 子句中)。
每個資料表的最大索引數和最大索引長度是根據儲存引擎定義的。請參閱第 17 章,InnoDB 儲存引擎,以及第 18 章,替代儲存引擎。所有儲存引擎都支援每個資料表至少 16 個索引,總索引長度至少為 256 個位元組。大多數儲存引擎都有更高的限制。
有關資料行索引的其他資訊,請參閱第 15.1.15 節,〈CREATE INDEX 陳述式〉。
使用字串資料行的索引規格中的 語法,您可以建立只使用該資料行前 col_name(N)N 個字元的索引。以這種方式為資料行值的前綴建立索引,可以使索引檔案小得多。當您為 BLOB 或 TEXT 資料行建立索引時,必須為索引指定前綴長度。例如
CREATE TABLE test (blob_col BLOB, INDEX(blob_col(10)));對於使用 REDUNDANT 或 COMPACT 資料列格式的 InnoDB 資料表,前綴長度上限為 767 個位元組。對於使用 DYNAMIC 或 COMPRESSED 資料列格式的 InnoDB 資料表,前綴長度上限為 3072 個位元組。對於 MyISAM 資料表,前綴長度上限為 1000 個位元組。
前綴限制是以位元組為單位測量的,而 CREATE TABLE、ALTER TABLE 和 CREATE INDEX 陳述式中的前綴長度則解釋為非二進位字串類型(CHAR、VARCHAR、TEXT)的字元數,以及二進位字串類型(BINARY、VARBINARY、BLOB)的位元組數。在為使用多位元組字元集的非二進位字串資料行指定前綴長度時,請考慮這一點。
如果搜尋字詞超過索引前綴長度,則會使用索引排除不符的資料列,並檢查其餘資料列是否有可能的相符項。
關於索引前綴的更多資訊,請參閱第 15.1.15 節「CREATE INDEX 語法」。
FULLTEXT 索引用於全文搜尋。只有 InnoDB 和 MyISAM 儲存引擎支援 FULLTEXT 索引,而且僅限於 CHAR、VARCHAR 和 TEXT 資料行。索引始終針對整個資料行進行,不支援資料行前綴索引。詳情請參閱第 14.9 節「全文搜尋函式」。
針對單一 InnoDB 資料表的某些 FULLTEXT 查詢,會套用最佳化。具有以下特性的查詢特別有效率:
FULLTEXT查詢只會傳回文件 ID,或文件 ID 和搜尋排名。FULLTEXT查詢會依分數的降序排序符合的資料列,並套用LIMIT子句以取得前 N 個符合的資料列。若要套用此最佳化,必須沒有WHERE子句,而且只能有一個降序的ORDER BY子句。FULLTEXT查詢只會擷取符合搜尋詞彙的資料列的COUNT(*)值,且沒有額外的WHERE子句。請將WHERE子句編寫為WHERE MATCH(,且不包含任何text) AGAINST ('other_text')> 0比較運算子。
對於包含全文運算式的查詢,MySQL 會在查詢執行的最佳化階段評估這些運算式。最佳化工具不只是查看全文運算式並進行估計,它實際上會在開發執行計畫的過程中評估它們。
此行為的含義是,對於在最佳化階段不會發生運算式評估的非全文查詢而言,全文查詢的 EXPLAIN 通常比非全文查詢慢。
全文查詢的 EXPLAIN 可能會在 Extra 資料行中顯示 Select tables optimized away,這是因為最佳化期間發生了比對;在這種情況下,稍後的執行期間不需要存取資料表。