MYSQL。如果我使用变量,LIKE 查询会变得太长

MYSQL. LIKE-query becomes too long if I use a variable

我有500万字的大table。我需要找到以动态字符串开头的单词。但是当我将 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;

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

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

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

所以,我需要做的就是使用 utf8:

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

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

  • 构造查询,而不是使用@variables。可能使用存储过程作为使用准备和执行的方式。
  • 从 MyISAM 切换到 InnoDB。
  • 你关心哪 100 行?没有 ORDER BYLIMIT 通常是不合适的。
  • 如果真的是"words"(不只是像'f'这样的字母),考虑FULLTEXT.
  • SHOW VARIABLES LIKE 'char%'; -- 这可能显示一个更简单的地方来调整 CHARACTER SET.