› 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 · Sep 25, 2019 · 5016 views
    This topic created in 2562 days ago, the information mentioned may be changed or developed.
    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 社寻找解决办法
    Supplement 1  ·  Sep 25, 2019
    顺便问个问题
    content REGEXP ‘PORTS.{0,3}PURE’ 这种条件用 LIKE 怎么写?
    这样? content LIKE ‘%PORTS%%%PURE%’,但是 PORTSPURE 匹配不出来,难道要这样写吗 content LIKE ‘%PORTS%%%PURE%’ OR content LIKE ‘%PORTSPURE%’,但是感觉蠢了点,有其他的写法吗
    8 replies  •  2019-09-26 09:44:14 +08:00
    StarkWhite
        1
    StarkWhite  
       Sep 25, 2019
    看起来就是两个字段任何一个包含搜索关键词的条件,
    为什么要 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  
       Sep 25, 2019
    @StarkWhite 还可以把正则换成 LIKE 试试
    deepall
        3
    deepall  
    OP
       Sep 25, 2019
    @StarkWhite 为什么不使用 LIKE,
    使用 LIKE,类似与 LIKE '%PORTS%' OR LIKE '%PUMA%',LIKE 以 % 开头的条件并不使用索引,因此在 cpu 的使用上不会有太大的变化
    gz911122
        4
    gz911122  
       Sep 25, 2019
    建议优化 es 版本....
    bbao
        5
    bbao  
       Sep 25, 2019
    这种需求,我会同步一份数据到 ES 里,从 ES 里面做关键字匹配,不会在 DB 里做。
    jetyang
        6
    jetyang  
       Sep 25, 2019
    DB 做这种检索效率极低,用 ES 才是正道
    deepall
        7
    deepall  
    OP
       Sep 25, 2019
    @gz911122 @bbao @jetyang es 确实是这个方向,但是这一块刚刚入门,不是特别熟悉,还在摸索中
    arrow8899
        8
    arrow8899  
       Sep 26, 2019
    这不是 mysql 的强项啊,es 查询不准确可以换分词器,或者导入自定义的词典。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   907 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 18:46 · PVG 02:46 · LAX 11:46 · JFK 14:46
    ♥ Do have faith in what you're doing.