最常見的索引類型涉及單一資料行,將該資料行的值副本儲存在資料結構中,以快速查找具有對應資料行值的資料列。 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
,這是因為最佳化期間發生了比對;在這種情況下,稍後的執行期間不需要存取資料表。