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

Posted

技术标签:

【中文标题】MySQL 查询调优 - 为啥使用变量中的值比使用文字慢得多?【英文标题】:MySQL Query Tuning - Why is using a value from a variable so much slower than using a literal?MySQL 查询调优 - 为什么使用变量中的值比使用文字慢得多? 【发布时间】:2013-02-20 18:11:41 【问题描述】:

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

我正在尝试修复 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 中的行,那么查询速度就像您期望的任何简单字符串比较一样快。

为什么?

【问题讨论】:

【参考方案1】:

当答案打到我时,我已经写完问题了,所以无论如何都要发布知识分享!

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

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

我将变量赋值替换为:

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

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

【讨论】:

谢谢。我只是在一个查询中苦苦挣扎,我只是将一个变量设置为一个文字字符串,与在查询中使用字符串相比,它降低了查询速度。我添加了 CONVERT,效果一样好。 很好的答案!同样,set @v = convert('' using latin1); 如果您的客户是 utf8 但您的表是 latin1。

以上是关于MySQL 查询调优 - 为啥使用变量中的值比使用文字慢得多?的主要内容,如果未能解决你的问题,请参考以下文章

python调用mysql中的自定义变量,为啥返回的值都是None

Mysql基础调优

MySQL调优4---索引

MySQL性能调优

mysql之explain

MYSQL数据库的设计与调优