приветствую,
имеем две таблицы:
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 просьба предлагать — слишком много переделок