Вот две таблицы, каждая из которых содержит только 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 VM на Windows, MySQL5)
Столбец id_order
в ps_product_access
умолчанию ps_product_access
0, может быть, вам нужно проверить, сколько строк у вас есть с id_order
= 0