mysql全文检索时怎么设置不分词

mysql全文检索时怎么设置不分词,第1张

不支持事务,没有行级锁,当数据库崩溃时,不可以安全恢复

加锁并发当读取某个表的数据时,会给该表加共享锁,写入时会加排他锁,在查询表的数据时可以并发插入新的记录

索引特性 支持 Text Blog 类型的字段作为索引,基于前500个字符创建,也支持全文索引

延迟更新索引键 每次修改键索引数据并不会马上写入硬盘上,而是在内存中的键缓冲区,在清理缓存区或关闭表时才写入磁盘中,但是当数据库崩溃时会造成索引的损失,需要执行修复 *** 作

MyISAM压缩表 就是当某个表创建时,并不需要进行修改则可以将表压缩,这样既节省了磁盘空间,又可以减少磁盘I/O 从而提升了查询的性能,压缩表也支持索引,不过也是只读的。

好处上面已经说了。最大的优点其实就是检索速度快,对服务器的负荷降低

缺点,如果说有的话,就是需要进行填充

上一次填充后,你增加的内容,直到你再次增量填充,否则是检索不到的。

你可以根据自己更新内容的频率设置调度来自动执行。

最近在复习数据库索引部分,看到了 fulltext,也即全文索引,虽然全文索引在平时的业务中用到的不多,但是感觉它有点儿意思,所以花了点时间研究一下,特此记录。

引入

概念

通过数值比较、范围过滤等就可以完成绝大多数我们需要的查询,但是,如果希望通过关键字的匹配来进行查询过滤,那么就需要基于相似度的查询,而不是原来的精确数值比较。全文索引就是为这种场景设计的。

你可能会说,用 like + % 就可以实现模糊匹配了,为什么还要全文索引?like + % 在文本比较少时是合适的,但是对于大量的文本数据检索,是不可想象的。全文索引在大量的数据面前,能比 like + % 快 N 倍,速度不是一个数量级,但是全文索引可能存在精度问题。

你可能没有注意过全文索引,不过至少应该对一种全文索引技术比较熟悉:各种的搜索引擎。虽然搜索引擎的索引对象是超大量的数据,并且通常其背后都不是关系型数据库,不过全文索引的基本原理是一样的。

版本支持

开始之前,先说一下全文索引的版本、存储引擎、数据类型的支持情况

MySQL 56 以前的版本,只有 MyISAM 存储引擎支持全文索引;

MySQL 56 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引;

只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。

测试或使用全文索引时,要先看一下自己的 MySQL 版本、存储引擎和数据类型是否支持全文索引。

*** 作全文索引

索引的 *** 作随便一搜都是,这里还是再啰嗦一遍。

创建

创建表时创建全文索引

create table fulltext_test (

id int(11) NOT NULL AUTO_INCREMENT,

content text NOT NULL,

tag varchar(255),

PRIMARY KEY (id),

FULLTEXT KEY content_tag_fulltext(content,tag) // 创建联合全文索引列

) ENGINE=MyISAM DEFAULT CHARSET=utf8;

在已存在的表上创建全文索引

create fulltext index content_tag_fulltext

on fulltext_test(content,tag);

通过 SQL 语句 ALTER TABLE 创建全文索引

alter table fulltext_test

add fulltext index content_tag_fulltext(content,tag);

修改

修改个 O,直接删掉重建。

删除

直接使用 DROP INDEX 删除全文索引

drop index content_tag_fulltext

on fulltext_test;

通过 SQL 语句 ALTER TABLE 删除全文索引

alter table fulltext_test

drop index content_tag_fulltext;

使用全文索引

和常用的模糊匹配使用 like + % 不同,全文索引有自己的语法格式,使用 match 和 against 关键字,比如

select from fulltext_test

where match(content,tag) against('xxx xxx');

主要从以下角度思考优化方向:1,Mysql配置优化主要对查询缓存,mysql数据库连接时长,开启慢查询日志(开启后还要分析sql)等方面进行优化2

Myslq语句优化3

Mysql索引优化主要是需要注意索引数量和索引失效情况,重复索引4

Mysql引擎优化innodb引擎注重于事务,能保证数据一致性myisam引擎可以进行全文检索,但不是事务安全当初在黑马程序员学过,还用实例进行优化学习

从explain开始说起吧,很显然第一个sql语句压根没用任何索引(key列内什么都没有)!第二个倒是用到索引,却是主键索引,并非你添加的fulltext索引!

接下来,分析下原因:

sql1:执行步骤:先s_a和s_a_t两表笛卡尔集,然后筛选满足on条件的,接着在从结果集中筛选满足where字句的;该过程中处理的记录条目为69105479,并且未用到任何索引,未用到的原因可能是你先定义了一个复合索引a_concent_split(a_title_split,a_content_split),然后又定义了一个a_content_split2(a_content_split),当引擎执行查找优化时候会先用到a_content_split,可是又由于复合索引是从最左边开始(不能跳过第一个字段),而你却忽略了a_title_split字段,故未能正常使用索引。

sql2:执行步骤:先调用where字句对s_a表进行筛选形成新的s_a表,然后与s_a_t表笛卡尔积,再利用on字句筛选,最后再次利用where字句形成最终结果集;经过第一个where,该过程处理结果集会大幅少于sql1,并且该过程还用到了主键索引。你所设置的fulltext索引再次没有用到,原因是like字句中开始部分为模糊匹配%时候用不了全文索引,这与fulltext存储机制有关。

另,你说的删除速度慢,原因:设置fulltext字段设置太多,fulltext索引在更新删除大量数据时候,需要同步更改索引,你的三个fulltext压力太大!

改进方法:1、删除a_content_split索引重试 2、在删除时候打开delay_key_write变量

有关fulltext比较复杂,用的时候要谨慎设置,还有很多参数也对其有影响

另外sql语句中外连接有关on where字句也是个比较绕的地方,两者你都占了,唉,所以我写的略复杂,前天看到该问题,思忖两天这才作答

望有结果了予以回复交流!

以上就是关于mysql全文检索时怎么设置不分词全部的内容,包括:mysql全文检索时怎么设置不分词、在数据库中使用全文索引的好外与坏处、mysqlfulltext长度为1等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10127276.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存