[MySQL] неожиданный план выполнения
От: C0s Россия  
Дата: 13.07.09 14:41
Оценка:
приветствую,

имеем две таблицы:
outbound_messages (PK: id bigint unsigned not null)
outbound_messages_archive (PK: id bigint unsigned not null)

таблицы одинаковой структуры, первая — оперативная, вторая — архив, в который перемещаются сообщения после завершения обработки
при этом за неимением sequences в mysql были вынуждены изобретать свой механизм.
этот самый механизм в начале работы приложения вычисляет текущий максимум id путём выполнения select:

SELECT max(x.id) FROM (SELECT max(ma.id) AS id FROM outbound_messages_archive ma UNION SELECT (m.id) AS id FROM outbound_messages m) x;


который, как выяснилось, выполняется медленно, хотя изначально казалось, что БД достаточно быстро задействовать оба PK и выбрать наибольшее из двух значений
обе части слева и справа UNION выполняются моментально, а всё вместе — занимает минуты

mysql> explain SELECT max(x.id) FROM (SELECT max(ma.id) AS id FROM outbound_messages_archive ma UNION SELECT (m.id) AS id FROM outbound_messages m) x;

+----+--------------+------------+-------+---------------+-------------------------+---------+------+--------+------------------------------+
| id | select_type  | table      | type  | possible_keys | key                     | key_len | ref  | rows   | Extra                        |
+----+--------------+------------+-------+---------------+-------------------------+---------+------+--------+------------------------------+
|  1 | PRIMARY      | <derived2> | ALL   | NULL          | NULL                    | NULL    | NULL |  52274 |                              |
|  2 | DERIVED      | NULL       | NULL  | NULL          | NULL                    | NULL    | NULL |   NULL | Select tables optimized away |
|  3 | UNION        | m          | index | NULL          | I_OUTBMSG_CREATION_DATE | 4       | NULL | 264392 | Using index                  |
|NULL| UNION RESULT | <union2,3> | ALL   | NULL          | NULL                    | NULL    | NULL |   NULL |                              |
+----+--------------+------------+-------+---------------+-------------------------+---------+------+--------+------------------------------+


кто-нибудь может объяснить, в чём наше заблуждение? просто советы тоже приветствуются, но перейти на строковый UUID просьба предлагать — слишком много переделок
mysql explain
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.