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
字符集(我的数据库的默认字符集),但列 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/
- 构造查询,而不是使用@variables。可能使用存储过程作为使用准备和执行的方式。
- 从 MyISAM 切换到 InnoDB。
- 你关心哪 100 行?没有
ORDER BY
的 LIMIT
通常是不合适的。
- 如果真的是"words"(不只是像'f'这样的字母),考虑
FULLTEXT
.
SHOW VARIABLES LIKE 'char%';
-- 这可能显示一个更简单的地方来调整 CHARACTER SET
.
我有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
字符集(我的数据库的默认字符集),但列 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/
- 构造查询,而不是使用@variables。可能使用存储过程作为使用准备和执行的方式。
- 从 MyISAM 切换到 InnoDB。
- 你关心哪 100 行?没有
ORDER BY
的LIMIT
通常是不合适的。 - 如果真的是"words"(不只是像'f'这样的字母),考虑
FULLTEXT
. SHOW VARIABLES LIKE 'char%';
-- 这可能显示一个更简单的地方来调整CHARACTER SET
.