我也来问个 sql 的优化问题

2019-09-25 18:00:26 +08:00
 deepall
1、SQL 语句:
SELECT * FROM tb_article_info WHERE CONCAT(title, content) REGEXP 'PORTS|PUMA|Michael.{0,3}Kors';

2、数据量
数据量目前也就 3w 多,预计一天增量不超过 300

3、业务描述:
根据关键词在库里面找寻符合要求的数据,有这些关键词(或之一),没有这些关键词(或之一)
目前已经做了一个 es 版本,应该是分词不准确,准确率不是特别高,mysql 的查询准确率提升了,但因为慢查询造成的 CPU 很高,特来 v 社寻找解决办法
4012 次点击
所在节点    MySQL
8 条回复
StarkWhite
2019-09-25 18:36:25 +08:00
看起来就是两个字段任何一个包含搜索关键词的条件,
为什么要 CONCAT(title, content) ? 而不是分开两个字段走正则?
SELECT * FROM sys.Comment WHERE title REGEXP 'PORTS|PUMA|Michael.{0,3}Kors' OR content REGEXP 'PORTS|PUMA|Michael.{0,3}Kors'
可以改成 UNION
SELECT * FROM sys.Comment WHERE title REGEXP 'PORTS|PUMA|Michael.{0,3}Kors'
UNION
SELECT * FROM sys.Comment WHERE content REGEXP 'PORTS|PUMA|Michael.{0,3}Kors'
都分别用几个常用关键词试试,哪个快用哪个,EXPLAIN 对比你的和我发的第一条,结果都一样,
第二条多了两步,但还是不好判断
StarkWhite
2019-09-25 18:36:52 +08:00
@StarkWhite 还可以把正则换成 LIKE 试试
deepall
2019-09-25 18:57:46 +08:00
@StarkWhite 为什么不使用 LIKE,
使用 LIKE,类似与 LIKE '%PORTS%' OR LIKE '%PUMA%',LIKE 以 % 开头的条件并不使用索引,因此在 cpu 的使用上不会有太大的变化
gz911122
2019-09-25 19:05:28 +08:00
建议优化 es 版本....
bbao
2019-09-25 19:10:21 +08:00
这种需求,我会同步一份数据到 ES 里,从 ES 里面做关键字匹配,不会在 DB 里做。
jetyang
2019-09-25 19:15:44 +08:00
DB 做这种检索效率极低,用 ES 才是正道
deepall
2019-09-25 19:18:43 +08:00
@gz911122 @bbao @jetyang es 确实是这个方向,但是这一块刚刚入门,不是特别熟悉,还在摸索中
arrow8899
2019-09-26 09:44:14 +08:00
这不是 mysql 的强项啊,es 查询不准确可以换分词器,或者导入自定义的词典。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/604143

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX