求一个 sql 语句优化

2021-07-14 17:08:59 +08:00
 shanyang88
本人是菜鸟。数据库为 mysql,数据量为三千万,以下语句执行一次要三个小时,实在是。。。
其中`t`为文章标题,`c`为长文章。以下字段做了索引:vcount 、ccount 、time 、t
请教高人们如何优化?
sql 如下:
SELECT `t`, `c`, `username`, `userid`, `time`, `ccount`, `vcount`, `u` FROM `p` where `pl`>=300 AND `ccount`>=4 AND time>'2021-01-01 00:00:00' AND (t LIKE '%合作%' or t LIKE '%启发%' or c LIKE '%合作%' or c LIKE '%启发%') ORDER BY publish_time DESC
1372 次点击
所在节点    问与答
11 条回复
AlkTTT
2021-07-14 18:01:36 +08:00
你这不是优化的事了吧,长文章,还用 like ;
试试 es ?
TimePPT
2021-07-14 18:02:22 +08:00
记得 like '%关键词%' 会索引失效全表扫
试试正则匹配?
aragakiyuii
2021-07-14 18:22:43 +08:00
shanyang88
2021-07-14 18:48:46 +08:00
@AlkTTT 请问啥是 es?
CEBBCAT
2021-07-14 19:42:03 +08:00
@shanyang88 #4 Google “ES 搜索”或者“MySQL 全文索引”,可以得到以下两个链接:
https://www.ruanyifeng.com/blog/2017/08/elasticsearch.html
http://mysql.taobao.org/monthly/2015/10/01/
chenqh
2021-07-14 19:47:12 +08:00
你大于 2021 的文章数目有多少?
感觉 mysql 的索引好弱, 每当这个时候就想 pg 了, 但是 pg 用起来不顺手呀
oneisall8955
2021-07-14 20:33:17 +08:00
MySQL:我好难
zakokun
2021-07-14 21:35:45 +08:00
首先我看语句是要找到符合那几个条件并且标题里面包含 这几个词语的文章对吗?
最好的方法是导入到 es 去搜索,但是我想这对你有点复杂,你可以换个方案,先执行
SELECT `t`, `c`, `username`, `userid`, `time`, `ccount`, `vcount`, `u` FROM `p` where `pl`>=300 AND `ccount`>=4 AND time>'2021-01-01 00:00:00'
这个条件,找到符合条件的文章,然后在代码中通过你们后端代码的字符串匹配功能去从 t 字段里面匹配这几个词语, 这个速度绝对比你用 sql 语句来匹配要快得多,然后 order by publish_time 也可以通过代码去排序
levelworm
2021-07-15 05:33:05 +08:00
能不能先把这些关键字全找出来然后用 IN ('...', '...')
xiaoqiao24
2021-07-15 09:16:51 +08:00
1. 模糊查询时,关键字前面有%不走索引,导致全表扫描
2. c 没有索引,导致全表扫描。

推荐:
一、mysql
1. 分库,分表式优化。不要在一张表里放大量数据,mysql 数据百万以上时,效率降低。
2. 模糊查询时,不要在关键字前面加%,避免全表扫描。

二、es
就单单针对模糊查询这点,赶紧上 es 吧,别犹豫了。
kiracyan
2021-07-15 14:20:41 +08:00
like 里面别用 or 了 单一条件 like 然后 union 应该会好不少

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

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

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

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

© 2021 V2EX