下列表格提供 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:提供關於InnoDB表格的FULLTEXT索引與相關處理的中繼資料。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索引中刪除的列。為了避免InnoDBFULLTEXT索引的 DML 操作期間進行昂貴的索引重新組織,新刪除的字詞資訊會單獨儲存,當您進行文字搜尋時會從搜尋結果中篩選出來,並且只有當您針對InnoDB表格發出OPTIMIZE TABLE陳述式時,才會從主要搜尋索引中移除。INNODB_FT_DEFAULT_STOPWORD:保留在InnoDB表格上建立FULLTEXT索引時預設使用的停用字清單。關於
INNODB_FT_DEFAULT_STOPWORD表格的資訊,請參閱 第 14.9.4 節,「全文停用詞」。INNODB_FT_INDEX_TABLE:提供用於處理針對InnoDB表格的FULLTEXT索引進行文字搜尋的反向索引的相關資訊。INNODB_FT_INDEX_CACHE:提供關於FULLTEXT索引中新插入列的詞彙資訊。為了避免在 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 全文索引 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索引的表格名稱。如果未設定此變數,則InnoDBFULLTEXTINFORMATION_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;