溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

InnoDB 層全文索引字典表 | 全方位認(rèn)識 information_schema

發(fā)布時間:2020-08-04 21:57:33 來源:ITPUB博客 閱讀:226 作者:沃趣科技 欄目:MySQL數(shù)據(jù)庫

在上一篇中,我們詳細(xì)介紹了 InnoDB 層的鎖、事務(wù)、及其相關(guān)的統(tǒng)計信息字典表 ,本期我們將為大家?guī)硐盗械谄咂禝nnoDB 層全文索引字典表 | 全方位認(rèn)識 information_schema》。


INNODB_FT_CONFIG

該表提供查詢有關(guān)InnoDB表的FULLTEXT索引和關(guān)聯(lián)的元數(shù)據(jù)信息

  • 查詢此表之前,需要先設(shè)置innodb_ft_aux_table='db_name/tb_name',db_name/tb_name為包含全文索引的表名和庫名

  • 查詢該表的賬戶需要有PROCESS權(quán)限,該表為Memory引擎臨時表

下面是該表中存儲的信息內(nèi)容

root@localhost : test 11:58:58> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_CONFIG;
+---------------------------+-------+
| KEY                      | VALUE |
+---------------------------+-------+
| optimize_checkpoint_limit | 180  |
| synced_doc_id            | 0    |
| stopword_table_name      |      |
| use_stopword              | 1    |
+---------------------------+-------+
4 rows in set (0.00 sec)

字段含義如下:

  • KEY:表示包含F(xiàn)ULLTEXT索引的InnoDB表的元數(shù)據(jù)項的名稱

  • VALUE:表示與相應(yīng)的KEY列關(guān)聯(lián)的值,反映InnoDB表的FULLTEXT索引的某方面的某些限制的值

PS:

  • 該表僅用于內(nèi)部配置使用。并不用做統(tǒng)計信息

  • KEY列的值可能會根據(jù)InnoDB全文處理的性能調(diào)優(yōu)和調(diào)試需求而變化。其中記錄的元數(shù)據(jù)項名稱值包括: 
    * optimize_checkpoint_limit:OPTIMIZE TABLE語句執(zhí)行的時間,單位秒 
    * synced_doc_id:下一個要執(zhí)行的DOC_ID值 
    * stopword_table_name:用戶定義的保存停用詞表的數(shù)據(jù)庫/表名。如果未自定義停用詞表,則該項記錄的value列為空 
    * use_stopword:表示是否使用停用詞表,該停用詞表在創(chuàng)建FULLTEXT索引時定義,默認(rèn)停用詞表為INFORMATION_SCHEMA.INNODB_FT_DEFAULT_STOPWORD


INNODB_FT_BEING_DELETED

該表僅在OPTIMIZE TABLE語句執(zhí)行維護(hù)操作期間作為INNODB_FT_DELETED表的快照數(shù)據(jù)存放使用。運行OPTIMIZE TABLE語句時,會先清空INNODB_FT_BEING_DELETED表中的數(shù)據(jù),保存INNODB_FT_DELETED表中的快照數(shù)據(jù)到INNODB_FT_BEING_DELETED表,并從INNODB_FT_DELETED表中刪除DOC_ID。由于INNODB_FT_BEING_DELETED表中的內(nèi)容通常生命周期較短,因此該表中的數(shù)據(jù)對于監(jiān)控或者調(diào)試來說用處并不大

  • 該表中默認(rèn)不記錄數(shù)據(jù),需要設(shè)置系統(tǒng)配置參數(shù)innodb_ft_aux_table=string(string表示db_name.tb_name字符串),并創(chuàng)建好全文索引,設(shè)置好停用詞等

  • 查詢該表的賬戶需要有PROCESS權(quán)限,該表為Memory引擎臨時表

下面是該表中存儲的信息內(nèi)容

# 設(shè)置innodb_ft_aux_table系統(tǒng)參數(shù)
root@localhost : test 11:50:16> SET GLOBAL innodb_ft_aux_table = 'test/test';
Query OK, 0 rows affected (0.00 sec)
# 創(chuàng)建全文索引
root@localhost : test 11:26:30> select * from test;
+------+---------+
| id  | test    |
+------+---------+
|    1 | a b c d |
|    1 | a b c d |
|    2 | a b c d |
+------+---------+
3 rows in set (0.00 sec)
root@localhost : test 11:51:06> alter table test add fulltext i_test(test);
Query OK, 0 rows affected, 1 warning (0.13 sec)
Records: 0  Duplicates: 0  Warnings: 1
# 刪除表中的數(shù)據(jù)
root@localhost : test 11:55:09> delete from test where id=1;
Query OK, 2 rows affected (0.06 sec)
# 查詢INNODB_FT_DELETED表和INNODB_FT_BEING_DELETED表中的數(shù)據(jù),可以發(fā)現(xiàn)INNODB_FT_BEING_DELETED為空值,而INNODB_FT_DELETED表存放著被刪除的全文索引值
root@localhost : test 11:56:12> select * from information_schema.INNODB_FT_DELETED;
+--------+
| DOC_ID |
+--------+
|      2 |
|      3 |
+--------+
2 rows in set (0.00 sec)
root@localhost : test 11:57:10> select * from information_schema.INNODB_FT_BEING_DELETED;
Empty set (0.00 sec)
# 執(zhí)行optimize table語句,然后再次查詢INNODB_FT_BEING_DELETED和INNODB_FT_DELETED表,如果表中數(shù)據(jù)夠大,在執(zhí)行optimize table語句期間,可以發(fā)現(xiàn)INNODB_FT_DELETED表為空值,INNODB_FT_BEING_DELETED表存放著之前被刪除的全文索引值
root@localhost : test 11:57:15> optimize table test;
+-----------+----------+----------+-------------------------------------------------------------------+
| Table    | Op      | Msg_type | Msg_text                                                          |
+-----------+----------+----------+-------------------------------------------------------------------+
| test.test | optimize | note    | Table does not support optimize, doing recreate + analyze instead |
| test.test | optimize | status  | OK                                                                |
+-----------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.08 sec)
root@localhost : test 11:58:50> select * from information_schema.INNODB_FT_DELETED;
Empty set (0.00 sec)
root@localhost : test 11:58:55> select * from information_schema.INNODB_FT_BEING_DELETED;
Empty set (0.00 sec)

字段含義如下:

  • DOC_ID:該字段表示正在被刪除的行的DOC_ID值。當(dāng)對表使用OPTIMIZE TABLE語句將已刪除行的數(shù)據(jù)從FULLTEXT索引中物理刪除之前,執(zhí)行了文本搜索時,此值用于跳過innodb_ft_index_table表中的行


INNODB_FT_DELETED

該表提供查詢從InnoDB表的FULLTEXT索引中刪除的行信息。它的存在是為了避免在InnoDB FULLTEXT索引的DML操作期間進(jìn)行昂貴的索引重組操作,新刪除的全文索引中單詞的信息將單獨存儲在該表中,在執(zhí)行文本搜索時從中過濾出搜索結(jié)果,該表中的信息僅在執(zhí)行OPTIMIZE TABLE語句時清空

  • 該表中的信息默認(rèn)不記錄,需要使用innodb_ft_aux_table選項(該選項默認(rèn)值為空串)指定需要記錄哪個innodb引擎表的信息,例如:test/test

  • 查詢該表的賬戶需要有PROCESS權(quán)限,該表為Memory引擎臨時表

下面是該表中存儲的信息內(nèi)容

# 使用innodb_ft_aux_table 選項指定包含全文索引的Innodb引擎表
root@localhost : test 11:41:01> SET GLOBAL innodb_ft_aux_table = 'test/test';
Query OK, 0 rows affected (0.00 sec)
# 刪除表中的行
root@localhost : test 11:41:24> delete from test where id=1;
Query OK, 3 rows affected (0.02 sec)
# 查詢INNODB_FT_DELETED表,此時INNODB_FT_DELETED表中就包含了被刪除的全文索引的DOC_ID值
root@localhost : test 11:41:29> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_DELETED;
+--------+
| DOC_ID |
+--------+
|      4 |
|      5 |
|      6 |
|    10 |
|    11 |
|    12 |
|    13 |
+--------+
7 rows in set (0.00 sec)

字段含義如下:

  • DOC_ID:從innodb_ft_aux_table參數(shù)指定的庫表中新刪除的行的全文索引DOC_ID值。該表中的值用于跳過innodb_ft_index_table表中的行查詢。在對innodb_ft_aux_table參數(shù)指定的表執(zhí)行OPTIMIZE TABLE語句時將清除INNODB_FT_DELETED表中的值


| INNODB_FT_DEFAULT_STOPWORD

該表為默認(rèn)的全文索引停用詞表,提供查詢停用詞列表值。啟用停用詞表需要開啟參數(shù)innodb_ft_enable_stopword=ON,該參數(shù)默認(rèn)為ON,啟用停用詞功能之后,如果innodb_ft_user_stopword_table選項(針對指定的innodb引擎表中的全文索引生效)自定義了停用詞庫表名稱值,則停用詞功能使用innodb_ft_user_stopword_table選項指定的停用詞表,如果innodb_ft_user_stopword_table選項未指定,而innodb_ft_server_stopword_table選項(針對所有的innodb引擎表中的全文索引生效)自定義了停用詞庫表名稱值,則同停用詞功能使用innodb_ft_server_stopword_table選項指定的停用詞表,如果innodb_ft_server_stopword_table選項也未指定,則使用默認(rèn)的停用詞表,即INNODB_FT_DEFAULT_STOPWORD表。

  • 查詢該表需要賬戶有PROCESS權(quán)限,該表為Memory引擎臨時表

下面是該表中存儲的信息內(nèi)容

# 默認(rèn)的停用詞列表值如下
admin@localhost : information_schema 06:46:38> select * from INNODB_FT_DEFAULT_STOPWORD;
+-------+
| value |
+-------+
| a    |
| about |
| an    |
| are  |
| as    |
| at    |
| be    |
| by    |
| com  |
| de    |
| en    |
| for  |
| from  |
| how  |
| i    |
| in    |
| is    |
| it    |
| la    |
| of    |
| on    |
| or    |
| that  |
| the  |
| this  |
| to    |
| was  |
| what  |
| when  |
| where |
| who  |
| will  |
| with  |
| und  |
| the  |
| www  |
+-------+
36 rows in set (0.00 sec)

字段含義如下:

  • value:默認(rèn)情況下用作InnoDB表的FULLTEXT索引的停用詞列表值。如果innodb_ft_server_stopword_table或innodb_ft_user_stopword_table選項指定了停用詞庫表值,則會覆蓋默認(rèn)的停用詞表,不使用默認(rèn)的停用詞表(INNODB_FT_DEFAULT_STOPWORD表)


| INNODB_FT_INDEX_CACHE

該表中提供查詢包含F(xiàn)ULLTEXT索引的innodb存儲引擎表中新插入行的全文索引標(biāo)記信息。它存在的目的是為了避免在DML操作期間進(jìn)行昂貴的索引重組,新插入的全文索引的單詞的信息被單獨存儲在該表中,直到對表執(zhí)行OPTIMIZE TABLE語句時、或者關(guān)閉服務(wù)器時、或者當(dāng)高速緩存中存放的信息大小超過了innodb_ft_cache_size或innodb_ft_total_cache_size系統(tǒng)配置參數(shù)指定的大小才會執(zhí)行清理

  • 該表默認(rèn)不記錄數(shù)據(jù),需要使用innodb_ft_aux_table系統(tǒng)配置參數(shù)指定需要記錄哪個表中的新插入行的全文索引數(shù)據(jù)

  • 查詢該表的賬戶需要有PROCESS權(quán)限,該表為Memory引擎臨時表

下面是該表中存儲的信息內(nèi)容

# 設(shè)置innodb_ft_aux_table選項指定需要記錄那個innodb表中的全文索引新插入的值
root@localhost : test 11:41:01> SET GLOBAL innodb_ft_aux_table = 'test/test';
Query OK, 0 rows affected (0.00 sec)
# 執(zhí)行插入
root@localhost : test 11:40:57> insert into test values(1,'a b dddd');
Query OK, 1 row affected (0.00 sec)
root@localhost : test 11:41:00> insert into test values(1,'a b dddd');
Query OK, 1 row affected (0.01 sec)
root@localhost : test 11:41:01> insert into test values(1,'a b dddd');
Query OK, 1 row affected (0.00 sec)
# 查看INNODB_FT_INDEX_CACHE表中的記錄數(shù)據(jù)
root@localhost : test 11:59:18> SELECT * FROM INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE;
+------+--------------+-------------+-----------+--------+----------+
| WORD | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID | POSITION |
+------+--------------+-------------+-----------+--------+----------+
| dddd |            6 |          13 |        8 |      6 |        4 |
| dddd |            6 |          13 |        8 |      7 |        4 |
| dddd |            6 |          13 |        8 |      8 |        4 |
| dddd |            6 |          13 |        8 |      9 |        4 |
| dddd |            6 |          13 |        8 |    10 |        4 |
| dddd |            6 |          13 |        8 |    11 |        4 |
| dddd |            6 |          13 |        8 |    12 |        4 |
| dddd |            6 |          13 |        8 |    13 |        4 |
+------+--------------+-------------+-----------+--------+----------+
8 rows in set (0.00 sec)

字段含義如下:

  • WORD:從新插入行的全文索引列值文本中提取的單詞文本

  • FIRST_DOC_ID:該單詞在FULLTEXT索引中出現(xiàn)的第一個DOC_ID值

  • LAST_DOC_ID:該單詞在FULLTEXT索引中出現(xiàn)的最后一個DOC_ID值

  • DOC_COUNT:該單詞在FULLTEXT索引中出現(xiàn)的行數(shù)。同一個單詞可以在緩存表中多次出現(xiàn),但每個DOC_ID列值和POSITION列值的組合只會出現(xiàn)一次(即具有唯一性)

  • DOC_ID:新插入的行的DOC_ID值

  • POSITION:由DOC_ID值標(biāo)識的該單詞在文檔中的特定位置。該值并不是絕對的位置,它是添加一行記錄時,WORD列值字符串在全文索引列值的整個字符串中的位置偏移量(相當(dāng)于python字符串對象中的下標(biāo)位置,例如:添加全文索引列值為'edf edfa eeeesdfs',而WORD列值記錄為'eeeesdfs',那么POSITION列值記錄為9,表示W(wǎng)ORD列值是從整個全文索引列值字符串'edf edfa eeeesdfs'的第9個位置開始記錄的)


INNODB_FT_INDEX_TABLE

該表中提供查詢關(guān)于innodb表全文索引中用于反向文本查找的倒排索引的分詞信息

  • 可以通過設(shè)置innodb_ft_aux_table來觀察倒排索引的輔助表:SET GLOBAL innodb_ft_aux_table='test/test'; 設(shè)置之后,就可以在information_schema下的表INNODB_FT_INDEX_TABLE得到表test中的分詞信息,為了支持全文檢索,必須有一個列與word進(jìn)行映射。在InnoDB中這個列被命名成FTS_DOC_ID,其類型為BIGINT UNSIGNED NOT NULL,并且InnoDB存儲引擎自動會在該列加上一個名為FTS_DOC_ID_INDEX的Unique Index.這些操作由存儲引擎自己完成,用戶也可以在建表時自動添加FTS_DOC_ID,以及對應(yīng)的Unique Index。由于列名FTS_DOC_ID聚友特殊意義,因此在創(chuàng)建時必須注意相應(yīng)的類型,否則會報錯

  • 文檔中的分詞的插入操作是在事務(wù)提交時完成,但是對于刪除操作,其在事務(wù)提交時,不刪除磁盤Auxiliary Table的記錄,而只是刪除FTS Cache Index記錄,對于Auxiliary Table中被刪除的記錄,存儲引擎會記錄其FTS DOCUMENT ID ,并將其保存在DELETE auxiliary table中,在設(shè)置參數(shù)innodb_ft_aux_table后,用戶可以訪問information_schema架構(gòu)下的表INNODB_FT_DELETED來觀察刪除的FTS Document ID

  • 由于文檔的DML操作實際并不刪除索引中的數(shù)據(jù),相反還會在對應(yīng)的DELETED表中插入記錄,因此隨著應(yīng)用程序的允許,索引會變得越來越大,即使索引中的有些數(shù)據(jù)已經(jīng)被刪除,查詢也不會選擇這類記錄,為此,InnoDB提供了一種方式,允許用戶手工將已刪除的記錄從索引中徹底刪除,這就是OPTIMIZE TABLE。因為OPTIMIZE TABLE還會進(jìn)行一些其他的操作。如Cardinality重新統(tǒng)計,若用戶希望對倒排索引進(jìn)行操作,可以通過innodb_optimize_fulltext_only設(shè)置:SET GLOBAL innodb_optimize_fulltext_only=1;OPTIMIZE TABLE test;(該操作會將全文索引的緩存信息刷新到磁盤)

  • 若被刪除的文檔很多,那么OPTIMIZE TABLE操作可能占用非常多的時間,會影響到程序并發(fā)性,并極大的降低用戶的響應(yīng)時間,用戶可以通過參數(shù)innodb_ft_num_word_optimize來限制每次實際刪除的分詞數(shù)量,默認(rèn)為2000

  • 查詢該表的賬戶需要有PROCESS權(quán)限,該表為Memory引擎臨時表

下面是該表中存儲的信息內(nèi)容

# 啟用innodb_optimize_fulltext_only系統(tǒng)配置參數(shù)
root@localhost : test 12:28:29> SET GLOBAL innodb_optimize_fulltext_only=ON;
Query OK, 0 rows affected (0.00 sec)
# 執(zhí)行優(yōu)化表語句
root@localhost : test 12:28:41>  OPTIMIZE TABLE test;
+-----------+----------+----------+----------+
| Table    | Op      | Msg_type | Msg_text |
+-----------+----------+----------+----------+
| test.test | optimize | status  | OK      |
+-----------+----------+----------+----------+
1 row in set (0.02 sec)
# 設(shè)置innodb_ft_aux_table 系統(tǒng)配置參數(shù)為剛剛執(zhí)行優(yōu)化的表
root@localhost : test 12:28:48> SET GLOBAL innodb_ft_aux_table = 'test/test';
Query OK, 0 rows affected (0.00 sec)
# 查詢INNODB_FT_INDEX_TABLE 表中記錄的值
root@localhost : test 12:28:55> select * from information_schema.INNODB_FT_INDEX_TABLE ;
+----------+--------------+-------------+-----------+--------+----------+
| WORD    | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID | POSITION |
+----------+--------------+-------------+-----------+--------+----------+
| edf      |            9 |          10 |        2 |      9 |        0 |
| edf      |            9 |          10 |        2 |    10 |        0 |
| edfa    |            9 |          10 |        2 |      9 |        4 |
| edfa    |            9 |          10 |        2 |    10 |        4 |
| eeee    |            8 |          8 |        1 |      8 |        4 |
| eeeesdf  |            9 |          9 |        1 |      9 |        9 |
| eeeesdfs |          10 |          10 |        1 |    10 |        9 |
| dddd    |            3 |          5 |        3 |      3 |        4 |
| dddd    |            3 |          5 |        3 |      4 |        4 |
| dddd    |            3 |          5 |        3 |      5 |        4 |
| ddde    |            6 |          6 |        1 |      6 |        4 |
| ddee    |            7 |          7 |        1 |      7 |        4 |
+----------+--------------+-------------+-----------+--------+----------+
12 rows in set (0.00 sec)

字段含義如下:與INNODB_FT_INDEX_CACHE表字段含義相同


本期內(nèi)容就介紹到這里,本期內(nèi)容參考鏈接如下:

https://dev.mysql.com/doc/refman/5.7/en/innodb-ft-config-table.html

https://dev.mysql.com/doc/refman/5.7/en/innodb-ft-being-deleted-table.html

https://dev.mysql.com/doc/refman/5.7/en/innodb-ft-deleted-table.html

https://dev.mysql.com/doc/refman/5.7/en/innodb-ft-default-stopword-table.html

https://dev.mysql.com/doc/refman/5.7/en/innodb-ft-index-table-table.html

https://dev.mysql.com/doc/refman/5.7/en/innodb-ft-index-cache-table.html


| 作者簡介

羅小波·沃趣科技高級數(shù)據(jù)庫技術(shù)專家

IT從業(yè)多年,主要負(fù)責(zé)MySQL 產(chǎn)品的數(shù)據(jù)庫支撐與售后二線支撐。曾參與版本發(fā)布系統(tǒng)、輕量級監(jiān)控系統(tǒng)、運維管理平臺、數(shù)據(jù)庫管理平臺的設(shè)計與編寫,熟悉MySQL體系結(jié)構(gòu),Innodb存儲引擎,喜好專研開源技術(shù),多次在公開場合做過線下線上數(shù)據(jù)庫專題分享,發(fā)表過多篇數(shù)據(jù)庫相關(guān)的研究文章。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI