У меня есть только для чтения доступ к базе данных MySQL, и мне нужно выполнить цикл через следующий запрос около 9000 раз, каждый раз с другим $ content_path_id. Я вызываю это из сценария PERL, который вытаскивает '$ content_path_id из файла.Оптимизация запроса MySQL с помощью вложенных операторов выбора?
SELECT an.uuid FROM alf_node an WHERE an.id IN
(SELECT anp.node_id FROM alf_node_properties anp WHERE anp.long_value IN
(SELECT acd.id FROM alf_content_data acd WHERE acd.content_url_id = $content_path_id));
Написано таким образом, он принимает навсегда сделать каждый запрос (примерно 1 минуту каждый). Я бы предпочел не ждать 9000 + минут, чтобы завершить это, если мне это не нужно. Есть ли способ ускорить этот запрос? Может быть, через соединение? Мои текущие навыки SQL смущающе ржавы ...
Почему бы не иметь все '$ content_path_id' в одной таблице, соединить эту таблицу с' alf_content_data' (на 'content_url_id'), затем присоединиться к результату с помощью' alf_node_properties', а затем присоединиться к результату с помощью 'alf_node'? –
'EXISTS' может быть быстрее, чем' IN'. См. Http://stackoverflow.com/questions/14190788/subqueries-with-exists-vs-in-mysql –
Спасибо Nitzan. К сожалению, у меня только доступ только для чтения к БД, поэтому я не могу добавить таблицу. –