MySQL 查询调优 - 为什么使用变量中的值比使用文字慢得多?

标签 mysql database-tuning query-tuning

更新:我自己在下面回答了这个问题。

我正在尝试修复 MySQL 查询中的性能问题。我想我看到的是,将函数的结果分配给变量,然后运行 ​​SELECT 与该变量进行比较相对较慢。

但是,如果为了测试起见,我将与变量的比较替换为与我知道该函数将返回的字符串文字等效的比较(对于给定场景),那么查询运行得更快。

例如:

...

SET @metaphone_val := double_metaphone(p_parameter)); -- double metaphone is user defined

SELECT 

        SQL_CALC_FOUND_ROWS
        t.col1,
        t.col2, 
        ...

    FROM table t

            WHERE

            t.pre_set_metaphone_string = @metaphone_val -- OPTION A

            t.pre_set_metaphone_string = 'PRN' -- OPTION B (Literal function return value for a given name)

如果我使用选项 A 中的行,查询会很慢。

如果我使用选项 B 中的行,那么查询会像您期望的任何简单字符串比较一样快。

为什么?

最佳答案

当答案出现时我已经写完问题了,所以还是发帖分享知识吧!

我意识到变音位函数的返回值是UTF8。

与 latin1 字段的比较显然会产生相当大的性能开销。

我将变量赋值替换为:

SET @metaphone_val:= CONVERT(double_metaphone(p_parameter) USING latin1);

现在查询的运行速度和我预期的一样快。

关于MySQL 查询调优 - 为什么使用变量中的值比使用文字慢得多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14986977/

相关文章:

mysql - Spring data JPA 存储库按条件排序

MySQL 将数据从一个表添加到另一个表

SQL Server 审核注销会产生大量读取

mysql - Mysql内存使用量不断增长,直到OOM和系统终止/重新启动

mysql - 快速获取mysql记录数的方法

php - 插入在第一个瑞典 UTF-8 字符处被截断

php - 用户已登录,但未重定向

mysql - 如何区分哪些变量用于 innodb 引擎或 MyIsam 引擎?

google-bigquery - 查询调优 Bigquery

python - 数据计算 MySQL 与 Python