欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

mysql全文索引

  • 停止詞(stopword)
一、什么是停止詞?
不能用于搜索的詞,如敏感詞匯:法輪功、李宏志、器官移植等;非常常見(jiàn)的無(wú)任何具體含議的詞匯: and、or、what 、好的、我們、你們、這樣 等等。

二、停止詞相關(guān)參數(shù)
MySQL> show variables like '%innodb%stop%';
+---------------------------------+-------+
| Variable_name                   | Value |
+---------------------------------+-------+
| innodb_ft_enable_stopword       | ON    |
| innodb_ft_server_stopword_table |       |
| innodb_ft_user_stopword_table   |       |
+---------------------------------+-------+


innodb_ft_server_stopword_table 和 innodb_ft_user_stopword_table:指定停止詞的 innodb 表,這兩個(gè)參唯一的區(qū)別就是 innodb_ft_user_stopword_table 的優(yōu)先級(jí)更高。如果沒(méi)有設(shè)置這2 個(gè)參數(shù)中的任何一個(gè),則使用默認(rèn)停止詞表 information_schema.INNODB_FT_DEFAULT_STOPWORD

三、創(chuàng)建停止詞
1、創(chuàng)建保存停止詞的表
create table stopword(value varchar(18));
注:字符串長(zhǎng)度設(shè)置不能少于 ngram_token_size * 字符長(zhǎng)度,字符長(zhǎng)度根字符集有關(guān),如:utf8 是一個(gè)中文字符占 3  個(gè)字節(jié),如果 ngram_token_size 的值是 2 ,則 2 * 3 = 6,最少不能少于6個(gè)字節(jié)(個(gè)人理解)

2、插入停止詞
insert into stopword values('法輪功')('李宏志')('我們的')('你們的');

四、innodb 全文索引的停止詞如何設(shè)置?
set global innodb_ft_user_stopword_table='test/stopword';
注: 停止詞更新后,需要重建全文索引才能生效,重建索引時(shí),stopword 表中的停止詞不再創(chuàng)建索引
注意格式:test 是 schema, stopword 是保證停止詞的表,中間用 "/" 連接


  • 中文分詞
innodb 的中文全分詞使用的是 ngram 支持,其算法是二元分詞法,可以通過(guò) ngram_token_size 參數(shù)設(shè)置分詞的長(zhǎng)度,默認(rèn)是 2 ,該值越大,索引越大。

mysql> show variables like '%ngram%';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| ngram_token_size | 2     |
+------------------+-------+
注:ngram_token_size的值為2 說(shuō)明以2個(gè)字符為一個(gè)詞,可以設(shè)置 innodb_ft_aux_table 參數(shù)查看分詞結(jié)果

一、查看分詞結(jié)果
1、設(shè)置參數(shù) innodb_ft_aux_table
set global innodb_ft_aux_table='test/test6';
注:test為 schema 名, test6 為具有全文索引的表名

2、查看分詞結(jié)果
--原數(shù)據(jù)
mysql> select * from test6 where id >= 7;
+----+-----------------------------+
| id | name                        |
+----+-----------------------------+
|  7 | 器官健康很重要              |
|  8 | 要做就做大買(mǎi)賣(mài)              |
|  9 | 官買(mǎi)官賣(mài)是不靠普的          |
+----+-----------------------------+

--分詞后的數(shù)據(jù)(全文索引)
mysql> select * from information_schema.innodb_ft_index_cache;
+--------+--------------+-------------+-----------+--------+----------+
| WORD   | FIRST_DOC_ID | LAST_DOC_ID | DOC_COUNT | DOC_ID | POSITION |
+--------+--------------+-------------+-----------+--------+----------+
| 買(mǎi)賣(mài)   |           11 |          11 |         1 |     11 |       15 |
| 做大   |           11 |          11 |         1 |     11 |        9 |
| 做就   |           11 |          11 |         1 |     11 |        3 |
| 健康   |           10 |          10 |         1 |     10 |        6 |
| 器官   |           10 |          10 |         1 |     10 |        0 |
| 大買(mǎi)   |           11 |          11 |         1 |     11 |       12 |
| 官健   |           10 |          10 |         1 |     10 |        3 |
| 就做   |           11 |          11 |         1 |     11 |        6 |
| 康很   |           10 |          10 |         1 |     10 |        9 |
| 很重   |           10 |          10 |         1 |     10 |       12 |
| 要做   |           11 |          11 |         1 |     11 |        0 |
| 重要   |           10 |          10 |         1 |     10 |       15 |
+--------+--------------+-------------+-----------+--------+----------+

innodb_ft_index_cache 和 innodb_ft_index_table 表的關(guān)系:
創(chuàng)建好全文索引后,所有的數(shù)據(jù)都保存在 innodb_ft_index_table 表中,當(dāng)有新的數(shù)據(jù) insert 后,這些新數(shù)據(jù)的全文索引保存在內(nèi)存表中,即 innodb_ft_index_cache,當(dāng)做 optimize table 操作時(shí),批量把表寫(xiě)入磁盤(pán)中,即 innodb_ft_index_table 表中。


  • innodb 如何創(chuàng)建支持中文的全文索引?
--在建表時(shí)指定
CREATE TABLE `test6` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(90) DEFAULT NULL,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `idx_name` (`name`) /*!50100 WITH PARSER `ngram` */
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8


-- 用 alter table 創(chuàng)建全文索引
alter table test6 add fulltext key idx_name(name) with parser ngram
注:對(duì)于中文全文索引必須指定  with parser ngram 關(guān)鍵字,否則innodb 默認(rèn)的分詞算法對(duì) 中文的支持很差。


  • 如何使用全文索引?
一、自然語(yǔ)言模式
-- 原數(shù)據(jù)
mysql> select * from test6 ;
+----+------------------------------------------+
| id | name                                     |
+----+------------------------------------------+
|  1 | 工地城工 有城                            |
|  2 | adfadsfadsfadsf                          |
|  3 | 產(chǎn)戟 要棵地地要要地大葉黃楊              |
|  4 | 宸ュ伐鍦板湴鏈夋湁鐨勭殑                 |
|  5 | 人人地工地                               |
|  6 | 霜國(guó)工直有直功發(fā)順豐                     |
|  7 | 器官健康很重要                           |
|  8 | 要做就做大買(mǎi)賣(mài)                           |
|  9 | 官買(mǎi)官賣(mài)是不靠普的                       |
+----+------------------------------------------+

-- 使用全文索引檢查
mysql> select * from test6 where match(name) against('買(mǎi)賣(mài)');
+----+-----------------------+
| id | name                  |
+----+-----------------------+
|  8 | 要做就做大買(mǎi)賣(mài)        |
+----+-----------------------+

mysql> explain select * from test6 where match(name) against('買(mǎi)賣(mài)' in  NATURAL LANGUAGE MODE);
+----+-------------+-------+------------+----------+---------------+----------+---------+-------+------+----------+-------------------------------+
| id | select_type | table | partitions | type     | possible_keys | key      | key_len | ref   | rows | filtered | Extra                         |
+----+-------------+-------+------------+----------+---------------+----------+---------+-------+------+----------+-------------------------------+
|  1 | SIMPLE      | test6 | NULL       | fulltext | idx_name      | idx_name | 0       | const |    1 |   100.00 | Using where; Ft_hints : sorted |
+----+-------------+-------+------------+----------+---------------+----------+---------+-------+------+----------+-------------------------------+
注:innodb 全文索引默認(rèn)就是使用 自然語(yǔ)言模式,所以可不用加   in  NATURAL LANGUAGE MODE


二、布爾模式
mysql> select * from test6 where match(name) against('買(mǎi)賣(mài)' in boolean mode );
+----+-----------------------+
| id | name                  |
+----+-----------------------+
|  8 | 要做就做大買(mǎi)賣(mài)        |
| 10 | 做買(mǎi)賣(mài)了              |
+----+-----------------------+

如果不想要包含了 “要做”的行,則可以:
mysql> select * from test6 where match(name) against('買(mǎi)賣(mài) -要做' in boolean mode);
+----+--------------+
| id | name         |
+----+--------------+
| 10 | 做買(mǎi)賣(mài)了     |
+----+--------------+
注:只有在布爾模式下才可用以上操作符。

布爾模式下支持以下操作符:
“+”表示必須包含
“-”表示必須排除
“>”表示出現(xiàn)該單詞時(shí)增加相關(guān)性
“<”表示出現(xiàn)該單詞時(shí)降低相關(guān)性
“*”表示通配符
“~”允許出現(xiàn)該單詞,但是出現(xiàn)時(shí)相關(guān)性為負(fù)
“""”表示短語(yǔ)
no operation表示find word是可選的,如果出現(xiàn),相關(guān)性會(huì)更高

可以通過(guò)以下命令查看 布爾模式支持的操作符:
mysql> show variables like '%ft_boolean_syntax%';
+-------------------+----------------+
| Variable_name     | Value          |
+-------------------+----------------+
| ft_boolean_syntax | + -><()~*:""&| |
+-------------------+----------------+
 

  • 如何維護(hù)全文索引?
一、DML操作對(duì)全文索引的影響
    1、插入操作
插入操作較為簡(jiǎn)單,當(dāng)往表中插入記錄時(shí),提交事務(wù)時(shí)會(huì)對(duì)全文索引上的列進(jìn)行分詞存儲(chǔ)到FTS Index Cache(INNODB_FT_INDEX_CACHE),最后在批量更新到Auxiliary Table(INNODB_FT_INDEX_TABLE)中
    2、刪除操作
當(dāng)提交刪除數(shù)據(jù)的事務(wù)以后,不會(huì)刪除Auxiliary Table中的數(shù)據(jù),而只會(huì)刪除FTS Index Cache中的數(shù)據(jù)。對(duì)于Auxiliary Table中被刪除的記錄,InnoDB存儲(chǔ)引擎會(huì)記錄其FTS Document Id,并將其保存在DELETED Auxiliary Table中。可以通過(guò)OPTIMIZE TABLE手動(dòng)刪除索引中的記錄。
    3、更新操作
    4、查找操作
分為兩步。第一步:根據(jù)檢索詞搜集符合條件的FTS_DOC_ID,在搜集滿足條件的FTS_DOC_ID首先讀取delete表中記錄的FTS_DOC_ID,這些FTS_DOC_ID隨后被用做過(guò)濾
第二步:根據(jù)FTS_DOC_ID找到對(duì)應(yīng)的記錄,找到的記錄是根據(jù)相關(guān)性大小降序返回的

二、innodb 全文索引相關(guān)表:
mysql> select table_schema, table_name from information_schema.tables where table_name like 'innodb_ft%';
+--------------------+----------------------------+
| table_schema       | table_name                 |
+--------------------+----------------------------+
| information_schema | INNODB_FT_CONFIG           |
| information_schema | INNODB_FT_BEING_DELETED    |
| information_schema | INNODB_FT_DELETED          |
| information_schema | INNODB_FT_DEFAULT_STOPWORD |
| information_schema | INNODB_FT_INDEX_TABLE      |
| information_schema | INNODB_FT_INDEX_CACHE      |
+--------------------+----------------------------+

INNODB_FT_DELETED :保存的是innodb 表中刪除的全文索引的doc_id,避免DML操作時(shí)重組全文索引。當(dāng)  OPTIMIZE TABLE 操作時(shí)才更新重組全文索引。 所以要時(shí)常的對(duì)具有全文索引的表進(jìn)行 OPTIMIZE TABLE 操作 ,要不然INNODB_FT_DELETED會(huì)很大,導(dǎo)至性能問(wèn)題
INNODB_FT_BEING_DELETED :只有在作 OPTIMIZE TABLE 操作時(shí)才使用,這是一個(gè)中間表,使用的時(shí)間很短。
INNODB_FT_INDEX_CACHE :當(dāng)新插入數(shù)據(jù)時(shí),保存新的全文索引,避免 insert 操作導(dǎo)致索引重組,當(dāng)遇到 OPTIMIZE TABLE、關(guān)閉服務(wù)、超過(guò) innodb_ft_cache_size或 innodb_ft_total_cache_size  的限制時(shí)才合并到主索引表中(INNODB_FT_INDEX_TABLE)。
INNODB_FT_CONFIG :innodb 全文索上的刷新、停止詞等信息。
注:要想正常使用INNODB_FT_DELETED、INNODB_FT_INDEX_CACHE等表,必需設(shè)置參數(shù) innodb_ft_aux_table,否則看不到任何信息,該參數(shù)應(yīng)該是用于調(diào)試使用

創(chuàng)建全文索引時(shí),可以設(shè)置并行度,通過(guò)參數(shù) innodb_ft_sort_pll_degree 控制。

三、innodb 全文索引相關(guān)參數(shù):
innodb_ft_aux_table: 設(shè)置調(diào)式表
ngram_token_size :分詞長(zhǎng)度
innodb_ft_server_stopword_table / innodb_ft_user_stopword_table :設(shè)置停止詞表,innodb_ft_user_stopword_table這個(gè)表的優(yōu)先級(jí)更高。
innodb_ft_min_token_size / innodb_ft_max_token_size :如果使用 ngram 全文索引中日韓語(yǔ)言插件,這 2 個(gè)參數(shù)不再有用。
innodb_ft_sort_pll_degree :創(chuàng)建全文索引時(shí)的并行度。
innodb_ft_cache_size / innodb_ft_total_cache_size :前一個(gè)是定議每個(gè)表的全文索引內(nèi)存大小,后一個(gè)設(shè)置所有表的全文索引內(nèi)存大小,如果全文索引大小超過(guò) innodb_ft_total_cache_size 的設(shè)置,則強(qiáng)制同步(我想是fulltext index 的cache 大小與全文索引大小強(qiáng)制保持一致,意味著有內(nèi)存中不能全部加載全文索引)被取消。
innodb_optimize_fulltext_only :optimize table 操作時(shí),只優(yōu)化全文索引。set innodb_optimize_fulltext_only = 1;

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來(lái)自于我們對(duì)這個(gè)行業(yè)的熱愛(ài)。我們立志把好的技術(shù)通過(guò)有效、簡(jiǎn)單的方式提供給客戶,將通過(guò)不懈努力成為客戶在信息化領(lǐng)域值得信任、有價(jià)值的長(zhǎng)期合作伙伴,公司提供的服務(wù)項(xiàng)目有:申請(qǐng)域名、網(wǎng)絡(luò)空間、營(yíng)銷軟件、網(wǎng)站建設(shè)、城區(qū)網(wǎng)站維護(hù)、網(wǎng)站推廣。

網(wǎng)站名稱:mysql全文索引
分享網(wǎng)址:http://chinadenli.net/article42/ggpchc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)品牌網(wǎng)站制作外貿(mào)建站搜索引擎優(yōu)化面包屑導(dǎo)航網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化