下列表格提供 FULLTEXT
索引的中繼資料
mysql> SHOW TABLES FROM INFORMATION_SCHEMA LIKE 'INNODB_FT%';
+-------------------------------------------+
| Tables_in_INFORMATION_SCHEMA (INNODB_FT%) |
+-------------------------------------------+
| INNODB_FT_CONFIG |
| INNODB_FT_BEING_DELETED |
| INNODB_FT_DELETED |
| INNODB_FT_DEFAULT_STOPWORD |
| INNODB_FT_INDEX_TABLE |
| INNODB_FT_INDEX_CACHE |
+-------------------------------------------+
表格概觀
INNODB_FT_CONFIG
:提供關於FULLTEXT
索引和InnoDB
表格的相關處理的中繼資料。INNODB_FT_BEING_DELETED
:提供INNODB_FT_DELETED
表格的快照;它僅在OPTIMIZE TABLE
維護操作期間使用。當執行OPTIMIZE TABLE
時,會清空INNODB_FT_BEING_DELETED
表格,並從INNODB_FT_DELETED
表格中移除DOC_ID
值。由於INNODB_FT_BEING_DELETED
的內容通常具有短暫的生命週期,因此此表格對於監視或偵錯的實用性有限。如需在具有FULLTEXT
索引的表格上執行OPTIMIZE TABLE
的相關資訊,請參閱第 14.9.6 節,「微調 MySQL 全文搜尋」。INNODB_FT_DELETED
:儲存從InnoDB
表格的FULLTEXT
索引中刪除的列。為了避免在InnoDB
FULLTEXT
索引的 DML 操作期間進行昂貴的索引重組,新刪除的文字的相關資訊會單獨儲存,在您執行文字搜尋時會從搜尋結果中篩選掉,並且只有在您針對InnoDB
表格發出OPTIMIZE TABLE
陳述式時,才會從主要搜尋索引中移除。INNODB_FT_DEFAULT_STOPWORD
:包含在InnoDB
資料表上建立FULLTEXT
索引時預設使用的停用詞 (stopwords) 清單。關於
INNODB_FT_DEFAULT_STOPWORD
資料表的資訊,請參閱 第 14.9.4 節,「全文檢索停用詞」。INNODB_FT_INDEX_TABLE
:提供關於反向索引的資訊,該索引用於針對InnoDB
資料表的FULLTEXT
索引處理文字搜尋。INNODB_FT_INDEX_CACHE
:提供關於FULLTEXT
索引中新插入列的 token 資訊。為了避免在 DML 操作期間進行昂貴的索引重組,新索引單字的資訊會分開儲存,只有在執行OPTIMIZE TABLE
、伺服器關閉時,或快取大小超過innodb_ft_cache_size
或innodb_ft_total_cache_size
系統變數定義的限制時,才會與主要搜尋索引合併。
除了 INNODB_FT_DEFAULT_STOPWORD
資料表之外,這些資料表最初都是空的。在查詢任何這些資料表之前,請將 innodb_ft_aux_table
系統變數的值設定為包含 FULLTEXT
索引的資料表名稱(包括資料庫名稱),例如 test/articles
。
範例 17.5 InnoDB FULLTEXT 索引 INFORMATION_SCHEMA 資料表
此範例使用具有 FULLTEXT
索引的資料表來示範 FULLTEXT
索引 INFORMATION_SCHEMA
資料表中的資料。
建立具有
FULLTEXT
索引的資料表並插入一些資料mysql> CREATE TABLE articles ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), body TEXT, FULLTEXT (title,body) ) ENGINE=InnoDB; mysql> INSERT INTO articles (title,body) VALUES ('MySQL Tutorial','DBMS stands for DataBase ...'), ('How To Use MySQL Well','After you went through a ...'), ('Optimizing MySQL','In this tutorial we show ...'), ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), ('MySQL vs. YourSQL','In the following database comparison ...'), ('MySQL Security','When configured properly, MySQL ...');
將
innodb_ft_aux_table
變數設定為具有FULLTEXT
索引的資料表名稱。如果未設定此變數,則InnoDB
FULLTEXT
INFORMATION_SCHEMA
資料表將為空,但INNODB_FT_DEFAULT_STOPWORD
除外。mysql> SET GLOBAL innodb_ft_aux_table = 'test/articles';
查詢
INNODB_FT_INDEX_CACHE
資料表,該表顯示關於FULLTEXT
索引中新插入列的資訊。為了避免在 DML 操作期間進行昂貴的索引重組,新插入列的資料會保留在FULLTEXT
索引快取中,直到執行OPTIMIZE TABLE
(或直到伺服器關閉或超過快取限制)。mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE LIMIT 5; +------------+--------------+-------------+-----------+--------+----------+ | WORD | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID | POSITION | +------------+--------------+-------------+-----------+--------+----------+ | 1001 | 5 | 5 | 1 | 5 | 0 | | after | 3 | 3 | 1 | 3 | 22 | | comparison | 6 | 6 | 1 | 6 | 44 | | configured | 7 | 7 | 1 | 7 | 20 | | database | 2 | 6 | 2 | 2 | 31 | +------------+--------------+-------------+-----------+--------+----------+
啟用
innodb_optimize_fulltext_only
系統變數,並在包含FULLTEXT
索引的資料表上執行OPTIMIZE TABLE
。此操作會將FULLTEXT
索引快取的內容刷新到主要的FULLTEXT
索引。innodb_optimize_fulltext_only
會變更OPTIMIZE TABLE
語句在InnoDB
資料表上的運作方式,並且旨在在具有FULLTEXT
索引的InnoDB
資料表的維護操作期間暫時啟用。mysql> SET GLOBAL innodb_optimize_fulltext_only=ON; mysql> OPTIMIZE TABLE articles; +---------------+----------+----------+----------+ | Table | Op | Msg_type | Msg_text | +---------------+----------+----------+----------+ | test.articles | optimize | status | OK | +---------------+----------+----------+----------+
查詢
INNODB_FT_INDEX_TABLE
資料表,以檢視主要FULLTEXT
索引中關於資料的資訊,包括剛從FULLTEXT
索引快取刷新的資料的資訊。mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_TABLE LIMIT 5; +------------+--------------+-------------+-----------+--------+----------+ | WORD | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID | POSITION | +------------+--------------+-------------+-----------+--------+----------+ | 1001 | 5 | 5 | 1 | 5 | 0 | | after | 3 | 3 | 1 | 3 | 22 | | comparison | 6 | 6 | 1 | 6 | 44 | | configured | 7 | 7 | 1 | 7 | 20 | | database | 2 | 6 | 2 | 2 | 31 | +------------+--------------+-------------+-----------+--------+----------+
由於
OPTIMIZE TABLE
操作刷新了FULLTEXT
索引快取,因此INNODB_FT_INDEX_CACHE
資料表現在為空。mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE LIMIT 5; Empty set (0.00 sec)
從
test/articles
資料表刪除一些記錄。mysql> DELETE FROM test.articles WHERE id < 4;
查詢
INNODB_FT_DELETED
資料表。此資料表會記錄從FULLTEXT
索引刪除的列。為了避免在 DML 操作期間進行昂貴的索引重組,關於新刪除記錄的資訊會分開儲存,在您執行文字搜尋時會從搜尋結果中篩除,並在您執行OPTIMIZE TABLE
時從主要搜尋索引中移除。mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DELETED; +--------+ | DOC_ID | +--------+ | 2 | | 3 | | 4 | +--------+
執行
OPTIMIZE TABLE
以移除已刪除的記錄。mysql> OPTIMIZE TABLE articles; +---------------+----------+----------+----------+ | Table | Op | Msg_type | Msg_text | +---------------+----------+----------+----------+ | test.articles | optimize | status | OK | +---------------+----------+----------+----------+
INNODB_FT_DELETED
資料表現在應為空。mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DELETED; Empty set (0.00 sec)
查詢
INNODB_FT_CONFIG
資料表。此資料表包含關於FULLTEXT
索引和相關處理的中繼資料optimize_checkpoint_limit
:執行OPTIMIZE TABLE
後停止的秒數。synced_doc_id
:要發出的下一個DOC_ID
。stopword_table_name
:使用者定義的停用詞資料表的資料庫/資料表
名稱。如果沒有使用者定義的停用詞資料表,則VALUE
欄位為空。use_stopword
:指出是否使用停用詞資料表,此是在建立FULLTEXT
索引時定義的。
mysql> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_CONFIG; +---------------------------+-------+ | KEY | VALUE | +---------------------------+-------+ | optimize_checkpoint_limit | 180 | | synced_doc_id | 8 | | stopword_table_name | | | use_stopword | 1 | +---------------------------+-------+
停用
innodb_optimize_fulltext_only
,因為它僅應暫時啟用mysql> SET GLOBAL innodb_optimize_fulltext_only=OFF;