我有一张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;
但是两个查询执行相同的工作。
请求的持续时间差异很大的原因可能是什么?如何消除这种差异?
结果发现变量有
utf8mb4
字符集(我数据库的默认字符集),但是 Word 列有 utf8
字符集。
所以,我需要做的就是使用
utf8
: 转换字符集
set @pattern = CONVERT('f%' USING utf8);
select * from words where Word like @pattern limit 100;
这是一个众所周知的问题,因为我们在堆中存储一个值,然后在查询中使用它,而不是直接在查询中使用,我建议阅读下面的文档来提高你的 mysql 性能: https://geekflare.com/mysql-performance-tuning/
LIMIT
的 ORDER BY
通常是不合适的。FULLTEXT
。SHOW VARIABLES LIKE 'char%';
——这可能会显示一个更简单的地方来调整 CHARACTER SET
。