【问题标题】:MYSQL. LIKE-query becomes too long if I use a variableMYSQL。如果我使用变量,LIKE-query 会变得太长
【发布时间】:2020-03-31 17:11:27
【问题描述】:

我有一张有 500 万字的大桌子。我需要找到以动态字符串开头的单词。但是当我将 LIKE 运算符与字符串变量一起使用时,查询会变得太长。

例如,这个查询需要 1.3 秒:

set @pattern = 'f%';
select * from words where Word like @pattern limit 100;

下一个查询需要 0.0 秒:

select * from words where Word like 'f%' limit 100;

但两个查询执行相同的工作。

请求的持续时间差异很大的原因可能是什么?如何消除这种差异?

【问题讨论】:

  • 关于words-table: ENGINE=MyISAM, CHARSET=utf8, COLLATE=utf8_bin, KEY WordIndex (Word), Word varchar(100) COLLATE utf8_bin NOT NULL跨度>

标签: mysql pattern-matching sql-like query-performance sqlperformance


【解决方案1】:

原来变量具有utf8mb4 字符集(我的数据库的默认字符集),但列Word 具有utf8 字符集。

所以,我需要做的就是使用utf8 转换字符集:

set @pattern = CONVERT('f%' USING utf8);
select * from words where Word like @pattern limit 100;

【讨论】:

    【解决方案2】:

    是一个已知问题,因为我们将值存储在堆中,然后在查询中使用它而不是直接在查询中使用,我建议提高您的 mysql 性能阅读以下文档: https://geekflare.com/mysql-performance-tuning/

    【讨论】:

      【解决方案3】:
      • 构造查询,而不是使用@variables。可能使用存储过程作为使用 Prepare 和 Execute 的一种方式。
      • 从 MyISAM 切换到 InnoDB。
      • 你关心哪 100 行?没有ORDER BYLIMIT 通常是不合适的。
      • 如果真的是“单词”(不仅仅是像“f”这样的字母),请考虑FULLTEXT
      • SHOW VARIABLES LIKE 'char%'; -- 这可能会显示一个更简单的位置来调整 CHARACTER SET

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-22
        • 2019-03-12
        • 1970-01-01
        • 2011-03-08
        • 1970-01-01
        相关资源
        最近更新 更多