MySql: использование @variable в избранном утверждении занимает в сотни раз больше времени - PullRequest
2 голосов
/ 06 декабря 2011

Я пытаюсь понять огромную разницу в производительности, которую я вижу в эквивалентном коде.Или, по крайней мере, код, который я считаю эквивалентным.

У меня есть таблица с примерно 10 миллионами записей.Он содержит поле, которое индексируется и определяется как: USPatentNum char (8)

Если я установлю переменную withSyvl в значение, это займет более 218 секунд.Точно такой же запрос со строковым литералом занимает менее 1/4 секунды.

В приведенном ниже коде первый оператор выбора (где USPatentNum = @pn;) выполняется вечно, а второй - сбуквальное значение (где USPatentNum = '5288812';) почти мгновенно

mysql> select @pn := '5288812';
+------------------+
| @pn := '5288812' |
+------------------+
| 5288812          |
+------------------+
1 row in set (0.00 sec)


mysql> select patentId, USPatentNum, grantDate from patents where USPatentNum = @pn;
+----------+-------------+------------+
| patentId | USPatentNum | grantDate  |
+----------+-------------+------------+
|   306309 | 5288812     | 1994-02-22 |
+----------+-------------+------------+
1 row in set (3 min 38.17 sec)

mysql> select @pn;
+---------+
| @pn     |
+---------+
| 5288812 |
+---------+
1 row in set (0.00 sec)


mysql> select patentId, USPatentNum, grantDate from patents where USPatentNum = '5288812';
+----------+-------------+------------+
| patentId | USPatentNum | grantDate  |
+----------+-------------+------------+
|   306309 | 5288812     | 1994-02-22 |
+----------+-------------+------------+
1 row in set (0.21 sec)

Два вопроса:

Почему использование @pn намного медленнее?Могу ли я изменить оператор выбора, чтобы производительность была такой же?

Ответы [ 2 ]

1 голос
/ 06 декабря 2011

Объявите @pn как char (8) перед установкой его значения.

Я подозреваю, что это будет varchar, как вы делаете это сейчас. Если это так, потеря производительности происходит из-за того, что MySql не может обработать индекс с вашей переменной.

0 голосов
/ 06 декабря 2011

Неважно, используете ли вы константу или @var. Вы получаете другой результат, потому что второй раз MySQL получает результаты из кэша. Если вы еще раз выполните свой сценарий, но сделка поменяет позиции с помощью const и @var, вы получите те же результаты (но с другим значением). Первый будет замедлен, второй будет быстрым.

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...