mysql-INNODB_FT_INDEX_TABLE表中的 first_doc_id 和、last_doc_id 和doc_id
例子:如果一张表有10行记录,name字段都是“male”,现在对name建立全文索引
好的,让我们详细分析一下你描述的场景,并解释在这种情况下 INNODB_FT_INDEX_TABLE
中会存储哪些记录。
场景描述
- 你有一张表,包含 10 行记录。
- 每一行的
name
字段值都为"male"
。 - 对
name
字段创建了全文索引(FULLTEXT INDEX)。
我们需要回答的问题是:在 INNODB_FT_INDEX_TABLE
中会存储哪些记录?
1. 全文索引的基本原理
- 全文索引会对字段内容进行分词处理(Tokenization),并将每个词项(term)与文档 ID (
doc_id
) 关联起来。 - 在你的例子中,
name
字段的内容始终是"male"
,因此全文索引只会生成一个词项"male"
。 - 每一行(文档)会被分配一个唯一的
doc_id
,即使它们的内容完全相同。
2. INNODB_FT_INDEX_TABLE
的结构
INNODB_FT_INDEX_TABLE
是 InnoDB 存储引擎内部的一个表,用于存储全文索引的倒排索引信息。它通常包含以下字段:
字段名 | 含义 |
---|---|
word | 词项(term),即分词后的单词或短语。 |
first_doc_id | 该词项出现的第一个文档 ID。 |
last_doc_id | 该词项出现的最后一个文档 ID。 |
doc_count | 包含该词项的文档总数。 |
doc_id | 具体包含该词项的文档 ID(每行一条记录)。 |
3. 示例数据
假设你的表名为 example_table
,结构如下:
CREATE TABLE example_table (
id INT PRIMARY KEY,
name VARCHAR(50),
FULLTEXT(name)
);
插入 10 条记录:
INSERT INTO example_table (id, name) VALUES
(1, 'male'),
(2, 'male'),
(3, 'male'),
(4, 'male'),
(5, 'male'),
(6, 'male'),
(7, 'male'),
(8, 'male'),
(9, 'male'),
(10, 'male');
执行以下步骤查看 INNODB_FT_INDEX_TABLE
中的信息:
(1) 设置 innodb_ft_aux_table
SET GLOBAL innodb_ft_aux_table = 'test/example_table';
(2) 查询倒排索引信息
SELECT word, first_doc_id, last_doc_id
FROM information_schema.INNODB_FT_INDEX_TABLE;
4. 查询结果分析
由于所有记录的 name
字段值都是 "male"
,INNODB_FT_INDEX_TABLE
中会存储以下记录:
word | first_doc_id | last_doc_id |
---|---|---|
male | 1 | 10 |
解释:
word
:分词后得到的唯一词项是"male"
。first_doc_id
:"male"
出现在第一个文档(doc_id = 1
)。last_doc_id
:"male"
出现在最后一个文档(doc_id = 10
)。
5. 更详细的倒排索引信息
如果你想查看更详细的倒排索引信息(例如每个文档的具体 doc_id
),可以查询 INNODB_FT_INDEX_TABLE
的完整内容:
SELECT * FROM information_schema.INNODB_FT_INDEX_TABLE;
可能的输出如下:
word | first_doc_id | last_doc_id | doc_count | doc_id |
---|---|---|---|---|
male | 1 | 10 | 10 | 1 |
male | 1 | 10 | 10 | 2 |
male | 1 | 10 | 10 | 3 |
male | 1 | 10 | 10 | 4 |
male | 1 | 10 | 10 | 5 |
male | 1 | 10 | 10 | 6 |
male | 1 | 10 | 10 | 7 |
male | 1 | 10 | 10 | 8 |
male | 1 | 10 | 10 | 9 |
male | 1 | 10 | 10 | 10 |
解释:
- 每一行代表一个文档 ID (
doc_id
) 和对应的词项"male"
。 first_doc_id
和last_doc_id
是词项"male"
覆盖的文档范围,分别为1
和10
。doc_count
表示包含该词项的文档总数,在这里是10
。
6. 总结
- 即使所有记录的
name
字段值相同(如"male"
),每条记录仍然会有唯一的doc_id
。 - 在
INNODB_FT_INDEX_TABLE
中,first_doc_id
和last_doc_id
会反映该词项覆盖的文档范围。 - 如果表中有 10 条记录,且
name
字段值都为"male"
,那么:first_doc_id
将是1
。last_doc_id
将是10
。doc_count
将是10
。
希望这个解释能够帮助你理解 INNODB_FT_INDEX_TABLE
的工作原理!如果还有其他疑问,请随时告诉我!