V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
shanyang88
V2EX  ›  问与答

求一个 sql 语句优化

  •  
  •   shanyang88 · 2021-07-14 17:08:59 +08:00 · 1372 次点击
    这是一个创建于 1254 天前的主题,其中的信息可能已经有所发展或是发生改变。
    本人是菜鸟。数据库为 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 条回复    2021-07-15 14:20:41 +08:00
    AlkTTT
        1
    AlkTTT  
       2021-07-14 18:01:36 +08:00
    你这不是优化的事了吧,长文章,还用 like ;
    试试 es ?
    TimePPT
        2
    TimePPT  
       2021-07-14 18:02:22 +08:00
    记得 like '%关键词%' 会索引失效全表扫
    试试正则匹配?
    aragakiyuii
        3
    aragakiyuii  
       2021-07-14 18:22:43 +08:00 via iPhone
    shanyang88
        4
    shanyang88  
    OP
       2021-07-14 18:48:46 +08:00
    @AlkTTT 请问啥是 es?
    CEBBCAT
        5
    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
        6
    chenqh  
       2021-07-14 19:47:12 +08:00
    你大于 2021 的文章数目有多少?
    感觉 mysql 的索引好弱, 每当这个时候就想 pg 了, 但是 pg 用起来不顺手呀
    oneisall8955
        7
    oneisall8955  
       2021-07-14 20:33:17 +08:00 via Android
    MySQL:我好难
    zakokun
        8
    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
        9
    levelworm  
       2021-07-15 05:33:05 +08:00
    能不能先把这些关键字全找出来然后用 IN ('...', '...')
    xiaoqiao24
        10
    xiaoqiao24  
       2021-07-15 09:16:51 +08:00
    1. 模糊查询时,关键字前面有%不走索引,导致全表扫描
    2. c 没有索引,导致全表扫描。

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

    二、es
    就单单针对模糊查询这点,赶紧上 es 吧,别犹豫了。
    kiracyan
        11
    kiracyan  
       2021-07-15 14:20:41 +08:00
    like 里面别用 or 了 单一条件 like 然后 union 应该会好不少
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5711 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 06:20 · PVG 14:20 · LAX 22:20 · JFK 01:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.