17.15.4 Таблицы индексов FULLTEXT InnoDB INFORMATION_SCHEMA
Следующие таблицы предоставляют метаданные для индексов 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_FT_BEING_DELETED: Предоставляет моментальный снимок таблицыINNODB_FT_DELETED; используется только во время операции обслуживанияOPTIMIZE TABLE. При выполненииOPTIMIZE TABLE, таблицаINNODB_FT_BEING_DELETEDочищается, а значенияDOC_IDудаляются из таблицыINNODB_FT_DELETED. Поскольку содержимое таблицыINNODB_FT_BEING_DELETEDобычно существует недолго, эта таблица имеет ограниченное применение для мониторинга или отладки. Сведения о выполненииOPTIMIZE TABLEдля таблиц с индексами FULLTEXT см. в Разделе 14.9.6, «Настройка параметров поиска MySQL по полному тексту».INNODB_FT_DELETED: Хранит строки, удаленные из индексаFULLTEXTдля таблицы.Для избежания дорогостоящей реорганизации индекса при операциях DML для индекса
InnoDBFULLTEXTинформация о вновь удалённых словах хранится отдельно, отфильтровывается из результатов поиска при выполнении текстового поиска и удаляется из основного индекса поиска только при выполнении оператораOPTIMIZE TABLEдля указанной таблицыInnoDB.-
INNODB_FT_DEFAULT_STOPWORD: Содержит список стоп-слов, используемых по умолчанию при создании индексаFULLTEXTдля таблиц.Подробную информацию о таблице
INNODB_FT_DEFAULT_STOPWORDсм. в Разделе 14.9.4, «Стоп-слова поиска по полному тексту». INNODB_FT_INDEX_TABLE: Предоставляет информацию об инвертированном индексе, используемом для обработки текстовых поисков для индекса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 Индекс FULLTEXT 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и выполнитеOPTIMIZE TABLEнад таблицей, содержащей индексFULLTEXT. Эта операция очищает содержимое кэша индексаFULLTEXTв основной индексFULLTEXT.innodb_optimize_fulltext_onlyизменяет способ работы командыOPTIMIZE TABLEнад таблицамиInnoDBи предназначена для временного включения во время операций технического обслуживания над таблицамиInnoDBс индексамиFULLTEXT.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 | +------------+--------------+-------------+-----------+--------+----------+Таблица
INNODB_FT_INDEX_CACHEтеперь пуста, так как операцияOPTIMIZE TABLEочистила кэш индексаFULLTEXT.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: Имяdatabase/tableдля пользовательской таблицы стоп-слов. Столбец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;
© 2025 Oracle
Licensed under the GPLv2 License.