数据库
背景
- 随着我们的业务越来越多,数据量也会越来越多, like ‘%%’的性能也会显著降低,比如根据商品名字模糊查询商品等等,那么如何才能提升这个问题呢?
- 随着数据变多,为了提升用户体验,我们遇到多字段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)
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | SIMPLE | biz_article | null | fulltext | query_full_text_index | query_full_text_index | 0 | const | 1 | 100 | Using where; Ft_hints: sorted |
后记
在我测试当中发现全文索引搜索不准确,排查一方面最后发现2个参数导致
修改my.cnf ,加入下面的参数,这两个默认为4,也可以改成1,但是会造成索引文件占用的磁盘空间暴增
[mysqld] ft_min_word_len=2 innodb_ft_min_token_size=2
重启 mysql
重新生成索引