如何提升 like "%%"查询性能 ,综合查询时候如何实现

如何提升 like "%%"查询效率以及综合查询时候如何实现
数据库

背景

  1. 随着我们的业务越来越多,数据量也会越来越多, like ‘%%’的性能也会显著降低,比如根据商品名字模糊查询商品等等,那么如何才能提升这个问题呢?
  2. 随着数据变多,为了提升用户体验,我们遇到多字段like %%查询,比如一个综合查询框,有订单号,客户姓名,客户手机号,地址信息,如果一个个like,显然不合适

解决方案

常见的方案有

  • elasticsearch (本章不在讨论)
  • 全文索引

全文索义 FULL-TXT

以我的博客的表为例子

修改表的字符集 或者将字段字符集

ALTER TABLE biz_article CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

创建全文索引

另外不加WITH PARSER ngram,会不支持中文分词,另外创建全文索引会占据大量的磁盘空间

ALTER TABLE biz_article
    ADD FULLTEXT INDEX query_full_text_index (title, content) WITH PARSER ngram;

查看效果

 explain select * from biz_article where  match(title,content) against('框架' in boolean  mode)
idselect_typetablepartitionstypepossible_keyskeykey_lenrefrowsfilteredExtra
1SIMPLEbiz_articlenullfulltextquery_full_text_indexquery_full_text_index0const1100Using where; Ft_hints: sorted

后记

在我测试当中发现全文索引搜索不准确,排查一方面最后发现2个参数导致

修改my.cnf ,加入下面的参数,这两个默认为4,也可以改成1,但是会造成索引文件占用的磁盘空间暴增

[mysqld]
ft_min_word_len=2
innodb_ft_min_token_size=2

重启 mysql

重新生成索引

bigcong

bigbigcong

3271
bigbigcong

bigcong

test
bigcong

bigcong

www
bigcong

bigcong

test
bigcong