首页 > 数据库 >mysql全文索引

mysql全文索引

时间:2023-03-31 16:57:17浏览次数:56  
标签:name 全文索引 AGAINST select MODE mysql where MATCH

建立索引语句

1.需要字段字符集一致utf8mb4 根据自己字段定义

ALTER TABLE user ADD FULLTEXT(name, email, phone, external_id) WITH PARSER ngram CHARSET utf8mb4;

索引占用空间

user表大约80M,创建的全文索引占用空间约100M (不含表大小)

使用

全文索引两种查法:

select * from user where MATCH(name, email, phone, external_id) AGAINST ('要查的关键字' IN NATURAL LANGUAGE MODE);

select * from user where MATCH(name, email, phone, external_id) AGAINST ('+包含的关键字 -不包含的关键' IN BOOLEAN MODE);

还有其他用法,但是不推荐使用 比如 WITH QUERY EXPANSION 选项,作用是搜索"database"字符串,相关的 mysql mssql oracle也会命中,但使用该方法将会使 CPU 内存消耗急剧增大,使用后有宕机风险。

ngram全文索引默认按两个中文分词, 比如查询 "花生壳" 而只查了"花" 则下面的语句无法命中:

select * from user where MATCH(name, email, phone, external_id) AGAINST ('花' IN NATURAL LANGUAGE MODE);
select * from user where MATCH(name, email, phone, external_id)AGAINST ('花' IN BOOLEAN MODE);

以下查询皆可命中:

select * from user where MATCH(name, email, phone, external_id) AGAINST ('花生' IN NATURAL LANGUAGE MODE);
select * from user where MATCH(name, email, phone, external_id) AGAINST ('花生壳' IN NATURAL LANGUAGE MODE);
select * from userwhere MATCH(name, email, phone, external_id) AGAINST ('生壳' IN NATURAL LANGUAGE MODE);

可以使用布尔模式,支持通配符(截断符):
https://dev.mysql.com/doc/refman/8.0/en/fulltext-boolean.html
以下结果可以命中:

select * from oray.cs_question where MATCH(`Title`,`Keyword`,`Description`,`Content`) AGAINST ('花*' IN BOOLEAN MODE);
select * from oray.cs_question where MATCH(`Title`,`Keyword`,`Description`,`Content`) AGAINST ('生*' IN BOOLEAN MODE);

使用全文索引两种查法,基本都可以在0.1秒内返回结果。

具体关联注意事项可以查看官网:

https://dev.mysql.com/doc/refman/8.0/en/fulltext-natural-language.html

标签:name,全文索引,AGAINST,select,MODE,mysql,where,MATCH
From: https://www.cnblogs.com/LQBlog/p/17276731.html

相关文章

  • Mysql之SQL语句基础1
    一、基本概念——后续的内容将会记录作者在计科学习内容DB(数据库):存储数据的仓库,数据是有组织进行存储DBMS(数据库管理系统):操纵和管理数据库的大型软件SQL:操纵关系数据库的编程语言,是一套标准有Mysql,Oracle,SQLSever,PostgreSQlRDBMS(关系型......
  • mysql Error:index column size too large. the maximum column size is 767 bytes
    问题现象mysql在执行脚本create创建表时,提示以下错误:indexcolumnsizetoolarge.themaximumcolumnsizeis767bytes异常原因INNODB引擎,UTF-8,主键字符串默认最大767,需要修改解决方案对数据库进行设置setglobalinnodb_large_prefix=ON参考博客......
  • php站点导入大mysql文件(linux系统)
    问题描述:站点数据多,mysql导出后大于1G,使用phpmyadmin,导入一半报错,白白浪费等待时间,使用navicat导入,执行时间过长提示错误解决思路:1.拆分mysql文件,分批次导入,亲测还是比较花费时间,小于100M可以尝试,大于100M不推荐2.推荐使用进入linux系统导入mysql,步骤如下:2.1:把导出的.sql大文......
  • mysql的查询--子查询,order by,group by,having
    一、1.多表查询 格式1: select字段列表 from表1join表2on表1.字段1=表2.字段1 where查询条件 格式2: select字段列表 from表1join表2on表1.字段1=表2.字段1 join表3on表2.字段2=表3.字段2 where查询条件 格式......
  • mysql,pg连接重试参数配置
    PostgreSQLJDBCURL连接重试的示例:StringdbUrl="jdbc:postgresql://localhost:5432/mydb?autoReconnect=true&maxReconnects=5&connectTimeout=5000";Connectionconnection=null;try{connection=DriverManager.getConnection(dbUrl,"user......
  • 在 MySQL 数据库中删除重复记录的步骤
    在MySQL数据库中删除重复记录的步骤当我们在处理数据库中的数据时,有时候会出现重复记录的情况,这些重复记录会影响数据的正确性,需要将其删除。下面是在MySQL数据库中删除重复记录的步骤:1.查找重复记录首先,我们需要找到数据库表中的重复记录。可以使用以下SQL语句查询表中......
  • MySQL插入数据报错:1366 Incorrect string value: '\xF0\xA0\xB9\xB3\xF0\xA0...
    [10501]SQLSTATE[22007]:Invaliddatetimeformat:1366Incorrectstringvalue:'\xF0\xA0\xB9\xB3\xF0\xA0...'forcolumnxxxxatrow1是因为MySQL不能识别4个字节的utf8编码的字符,抛出了异常。解决办法将字符类型换成改为utf8mb4数据库:ALTERDATABASE`db_name`C......
  • 力扣602(MySQL)-好友申请Ⅱ:谁有最多的好友(中等)
    题目:在Facebook或者Twitter这样的社交应用中,人们经常会发好友申请也会收到其他人的好友申请。RequestAccepted表:(requester_id,accepter_id)是这张表的主键。这张表包含发送好友请求的人的ID,接收好友请求的人的ID,以及好友请求通过的日期。问题写一个查询语句,找出......
  • 力扣601(MySQL)-体育馆的人的流量(困难)
    题目:表:Stadium编写一个SQL查询以找出每行的人数大于或等于100且id连续的三行或更多行记录。返回按visit_date升序排列的结果表。查询结果格式如下所示示例1:  解释:id为5、6、7、8的四行id连续,并且每行都有>=100的人数记录。请注意,即使第7行和第8行......
  • MySQL按日期分组统计(按天统计,按月统计)
    按月统计(一)selectdate_format(create_time,'%Y-%m')mont,count(*)counfromt_contentgroupbydate_format(create_time,'%Y-%m');按天统计(二)selectdate_format(create_time,'%Y-%m-%d')dat,count(*)counfromt_contentgroupby......