Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MySQL Query Tuning - Why is using a value from a variable so much slower than using a literal?

UPDATE: I've answered this myself below.

I'm trying to fix a performance issue in a MySQL query. What I think I'm seeing, is that assigning the result of a function to a variable, and then running a SELECT with a compare against that variable is relatively slow.

If for testings sake however, I replace the compare to the variable with a compare to the string literal equivalent of what I know that function will return (for a given scenario), then the query runs much faster.

For example:

...

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)

If I use the line in option A, the query is slow.

If I use the line in option B, then the query is fast as you would expect any simple string compare to be.

Why?

like image 225
gb2d Avatar asked Feb 20 '13 18:02

gb2d


People also ask

Why is my MySQL query running slow?

Queries can become slow for various reasons ranging from improper index usage to bugs in the storage engine itself. However, in most cases, queries become slow because developers or MySQL database administrators neglect to monitor them and keep an eye on their performance.

What is query tuning in MySQL?

SQL performance tuning is the process of maximizing query speeds on a relational database. The task usually involves multiple tools and techniques. These methods involve: Tweaking the MySQL configuration files. Writing more efficient database queries.

How do I speed up a large MySQL database?

Tip #1: Index All Columns Used in 'where', 'order by' and 'group by' Clauses. Apart from guaranteeing uniquely identifiable records, an index allows MySQL server to fetch results faster from a database. An index is also very useful when it comes to sorting records.


1 Answers

Was finished writing the question when the answer hit me, so posting anyway for knowledge sharing!

I realised that the return value of the metaphone function was UTF8.

The compare to a latin1 field was obviously incurring a fairly heavy performance overhead.

I replaced the variable assignment with:

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

Now the query runs as fast as I would expect.

like image 115
gb2d Avatar answered Dec 19 '22 14:12

gb2d