This topic created in 1797 days ago, the information mentioned may be changed or developed.
本人是菜鸟。数据库为 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
11 replies • 2021-07-15 14:20:41 +08:00
 |
|
1
AlkTTT Jul 14, 2021
你这不是优化的事了吧,长文章,还用 like ; 试试 es ?
|
 |
|
2
TimePPT Jul 14, 2021
记得 like '%关键词%' 会索引失效全表扫 试试正则匹配?
|
 |
|
6
simple2025 Jul 14, 2021
你大于 2021 的文章数目有多少? 感觉 mysql 的索引好弱, 每当这个时候就想 pg 了, 但是 pg 用起来不顺手呀
|
 |
|
7
itechify Jul 14, 2021 via Android
MySQL:我好难
|
 |
|
8
zakokun Jul 14, 2021
首先我看语句是要找到符合那几个条件并且标题里面包含 这几个词语的文章对吗? 最好的方法是导入到 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 也可以通过代码去排序
|
 |
|
9
levelworm Jul 15, 2021
能不能先把这些关键字全找出来然后用 IN ('...', '...')
|
 |
|
10
xiaoqiao24 Jul 15, 2021
1. 模糊查询时,关键字前面有%不走索引,导致全表扫描 2. c 没有索引,导致全表扫描。
推荐: 一、mysql 1. 分库,分表式优化。不要在一张表里放大量数据,mysql 数据百万以上时,效率降低。 2. 模糊查询时,不要在关键字前面加%,避免全表扫描。
二、es 就单单针对模糊查询这点,赶紧上 es 吧,别犹豫了。
|
 |
|
11
kiracyan Jul 15, 2021
like 里面别用 or 了 单一条件 like 然后 union 应该会好不少
|