Тайм-аут с внутренним объединением двух таблиц MySQL

0

Вот две таблицы, каждая из которых содержит только 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)

  • 0
    Возможно, опечатка, но в ps_product_access нет столбца id_product_access
  • 0
    Вы запускаете этот запрос из кода приложения? или используя PHPMyadmin, Workbench и т. д.?
Показать ещё 10 комментариев
Теги:
indexing

1 ответ

1
Лучший ответ

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

  • 0
    Спасибо! Принято +1

Ещё вопросы

Сообщество Overcoder
Наверх
Меню