最常見的索引類型涉及單一欄位,將該欄位的值複本儲存在資料結構中,允許快速查找具有對應欄位值的列。B 樹資料結構可讓索引快速找到 WHERE
子句中與 =
、>
、≤
、BETWEEN
、IN
等運算子對應的特定值、一組值或一系列值。
每個資料表的最大索引數和最大索引長度是根據每個儲存引擎定義的。請參閱第 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
,因為最佳化期間會發生比對;在這種情況下,在稍後的執行期間不需要進行資料表存取。