Я пытаюсь понять огромную разницу в производительности, которую я вижу в эквивалентном коде.Или, по крайней мере, код, который я считаю эквивалентным.
У меня есть таблица с примерно 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 намного медленнее?Могу ли я изменить оператор выбора, чтобы производительность была такой же?