V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
deepall
V2EX  ›  MySQL

我也来问个 sql 的优化问题

  •  
  •   deepall · 2019-09-25 18:00:26 +08:00 · 4004 次点击
    这是一个创建于 1904 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 社寻找解决办法
    第 1 条附言  ·  2019-09-25 19:22:12 +08:00
    顺便问个问题
    content REGEXP ‘PORTS.{0,3}PURE’ 这种条件用 LIKE 怎么写?
    这样? content LIKE ‘%PORTS%%%PURE%’,但是 PORTSPURE 匹配不出来,难道要这样写吗 content LIKE ‘%PORTS%%%PURE%’ OR content LIKE ‘%PORTSPURE%’,但是感觉蠢了点,有其他的写法吗
    8 条回复    2019-09-26 09:44:14 +08:00
    StarkWhite
        1
    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
        2
    StarkWhite  
       2019-09-25 18:36:52 +08:00
    @StarkWhite 还可以把正则换成 LIKE 试试
    deepall
        3
    deepall  
    OP
       2019-09-25 18:57:46 +08:00
    @StarkWhite 为什么不使用 LIKE,
    使用 LIKE,类似与 LIKE '%PORTS%' OR LIKE '%PUMA%',LIKE 以 % 开头的条件并不使用索引,因此在 cpu 的使用上不会有太大的变化
    gz911122
        4
    gz911122  
       2019-09-25 19:05:28 +08:00
    建议优化 es 版本....
    bbao
        5
    bbao  
       2019-09-25 19:10:21 +08:00
    这种需求,我会同步一份数据到 ES 里,从 ES 里面做关键字匹配,不会在 DB 里做。
    jetyang
        6
    jetyang  
       2019-09-25 19:15:44 +08:00
    DB 做这种检索效率极低,用 ES 才是正道
    deepall
        7
    deepall  
    OP
       2019-09-25 19:18:43 +08:00
    @gz911122 @bbao @jetyang es 确实是这个方向,但是这一块刚刚入门,不是特别熟悉,还在摸索中
    arrow8899
        8
    arrow8899  
       2019-09-26 09:44:14 +08:00
    这不是 mysql 的强项啊,es 查询不准确可以换分词器,或者导入自定义的词典。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4798 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 03:45 · PVG 11:45 · LAX 19:45 · JFK 22:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.