中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

InnoDB 層全文索引字典表 | 全方位認識 information_schema

發布時間:2020-08-04 21:57:33 來源:ITPUB博客 閱讀:230 作者:沃趣科技 欄目:MySQL數據庫

在上一篇中,我們詳細介紹了 InnoDB 層的鎖、事務、及其相關的統計信息字典表 ,本期我們將為大家帶來系列第七篇《InnoDB 層全文索引字典表 | 全方位認識 information_schema》。


INNODB_FT_CONFIG

該表提供查詢有關InnoDB表的FULLTEXT索引和關聯的元數據信息

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

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

下面是該表中存儲的信息內容

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:表示包含FULLTEXT索引的InnoDB表的元數據項的名稱

  • VALUE:表示與相應的KEY列關聯的值,反映InnoDB表的FULLTEXT索引的某方面的某些限制的值

PS:

  • 該表僅用于內部配置使用。并不用做統計信息

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


INNODB_FT_BEING_DELETED

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

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

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

下面是該表中存儲的信息內容

# 設置innodb_ft_aux_table系統參數
root@localhost : test 11:50:16> SET GLOBAL innodb_ft_aux_table = 'test/test';
Query OK, 0 rows affected (0.00 sec)
# 創建全文索引
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
# 刪除表中的數據
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表中的數據,可以發現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)
# 執行optimize table語句,然后再次查詢INNODB_FT_BEING_DELETED和INNODB_FT_DELETED表,如果表中數據夠大,在執行optimize table語句期間,可以發現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值。當對表使用OPTIMIZE TABLE語句將已刪除行的數據從FULLTEXT索引中物理刪除之前,執行了文本搜索時,此值用于跳過innodb_ft_index_table表中的行


INNODB_FT_DELETED

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

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

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

下面是該表中存儲的信息內容

# 使用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參數指定的庫表中新刪除的行的全文索引DOC_ID值。該表中的值用于跳過innodb_ft_index_table表中的行查詢。在對innodb_ft_aux_table參數指定的表執行OPTIMIZE TABLE語句時將清除INNODB_FT_DELETED表中的值


| INNODB_FT_DEFAULT_STOPWORD

該表為默認的全文索引停用詞表,提供查詢停用詞列表值。啟用停用詞表需要開啟參數innodb_ft_enable_stopword=ON,該參數默認為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選項也未指定,則使用默認的停用詞表,即INNODB_FT_DEFAULT_STOPWORD表。

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

下面是該表中存儲的信息內容

# 默認的停用詞列表值如下
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:默認情況下用作InnoDB表的FULLTEXT索引的停用詞列表值。如果innodb_ft_server_stopword_table或innodb_ft_user_stopword_table選項指定了停用詞庫表值,則會覆蓋默認的停用詞表,不使用默認的停用詞表(INNODB_FT_DEFAULT_STOPWORD表)


| INNODB_FT_INDEX_CACHE

該表中提供查詢包含FULLTEXT索引的innodb存儲引擎表中新插入行的全文索引標記信息。它存在的目的是為了避免在DML操作期間進行昂貴的索引重組,新插入的全文索引的單詞的信息被單獨存儲在該表中,直到對表執行OPTIMIZE TABLE語句時、或者關閉服務器時、或者當高速緩存中存放的信息大小超過了innodb_ft_cache_size或innodb_ft_total_cache_size系統配置參數指定的大小才會執行清理

  • 該表默認不記錄數據,需要使用innodb_ft_aux_table系統配置參數指定需要記錄哪個表中的新插入行的全文索引數據

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

下面是該表中存儲的信息內容

# 設置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: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表中的記錄數據
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索引中出現的第一個DOC_ID值

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

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

  • DOC_ID:新插入的行的DOC_ID值

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


INNODB_FT_INDEX_TABLE

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

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

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

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

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

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

下面是該表中存儲的信息內容

# 啟用innodb_optimize_fulltext_only系統配置參數
root@localhost : test 12:28:29> SET GLOBAL innodb_optimize_fulltext_only=ON;
Query OK, 0 rows affected (0.00 sec)
# 執行優化表語句
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)
# 設置innodb_ft_aux_table 系統配置參數為剛剛執行優化的表
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表字段含義相同


本期內容就介紹到這里,本期內容參考鏈接如下:

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


| 作者簡介

羅小波·沃趣科技高級數據庫技術專家

IT從業多年,主要負責MySQL 產品的數據庫支撐與售后二線支撐。曾參與版本發布系統、輕量級監控系統、運維管理平臺、數據庫管理平臺的設計與編寫,熟悉MySQL體系結構,Innodb存儲引擎,喜好專研開源技術,多次在公開場合做過線下線上數據庫專題分享,發表過多篇數據庫相關的研究文章。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

长治县| 明星| 嘉定区| 班玛县| 微博| 礼泉县| 姚安县| 舞阳县| 清流县| 平泉县| 龙门县| 静乐县| 威信县| 南京市| 威海市| 高雄县| 宝山区| 太湖县| 遂平县| 剑川县| 武山县| 兴化市| 兴国县| 武汉市| 双牌县| 开平市| 新建县| 武夷山市| 宜城市| 湾仔区| 邛崃市| 上杭县| 修武县| 大名县| 华容县| 金坛市| 南充市| 林口县| 甘洛县| 灵石县| 石首市|