Вот две таблицы, по 50 тыс. Строк в каждой:

CREATE TABLE `ps_product_access` (
  `id_order` int(10) UNSIGNED NOT NULL DEFAULT '0',
  `id_product_access` int(10) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE `ps_product_access`
  ADD KEY `id_order` (`id_order`);

CREATE TABLE `ps_orders` (
  `id_order` int(10) UNSIGNED NOT NULL,
  `id_order_renew` int(10) UNSIGNED NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

ALTER TABLE `ps_orders`
  ADD PRIMARY KEY (`id_order`)
  ADD KEY `ps_orders__id_order_renew__index` (`id_order_renew`);

Таблицы чрезмерно упрощены и содержат только соответствующие поля. Внешнего ключа нет, но я не могу его добавить прямо сейчас (данные в этой базе данных несовместимы).

Этот запрос не работает (значит, загрузка бесконечна):

SELECT pa.`id_product_access`
FROM `ps_product_access` pa
INNER JOIN `ps_orders` o ON pa.id_order = o.id_order_renew;

Я не могу понять почему? Это кажется довольно простым, просто внутреннее соединение. Я знаю, что могу оптимизировать запрос с помощью WHERE EXISTS, но это не главный вопрос. Этот запрос не должен приводить к бесконечной загрузке, так как данных почти нет (50 тыс. Строк). Я что-то пропустил?

Примечание: я запускаю этот запрос на новой установке MySQL 8 (установленной через brew на MacOS). Я видел ту же проблему с теми же данными на другом компьютере с совершенно другой конфигурацией (виртуальная машина ubuntu в Windows, MySQL5)

0
rap-2-h 22 Ноя 2018 в 16:18

1 ответ

Лучший ответ

Столбец id_order в ps_product_access по умолчанию равен 0, возможно, вам нужно проверить, сколько строк у вас есть с id_order = 0

1
Joakim Danielson 22 Ноя 2018 в 15:12