2014-01-22 6 views
0

У меня проблемы с workign с выбором mysql внутри другого.MySql SELECT внутри SELECT очень медленно

Этот запрос занимает 0,0007 сек:

SELECT node.title AS node_title 
FROM node node 
WHERE (((node.status = '1') AND (node.type IN ('event')) AND (node.uid= 1))) 

Но это занимает 9 секунд:

SELECT node.title AS node_title 
FROM node node 
WHERE (((node.status = '1') AND (node.type IN ('event')) AND (node.uid= 1) OR node.nid IN (SELECT n.nid FROM tag n WHERE n.uid='1'))) 

Кто-нибудь знает, почему? обе отдельные действительно быстрые.

Что мне нужно сделать, это получить некоторые данные с ведьмой, я могу получить некоторые данные с некоторыми объединениями. Я также судимый этот путь, но с той же проблемой производительности:

SELECT node.title AS node_title 
FROM 
node node 
LEFT JOIN tag tag ON tag.uid = 4 
WHERE (((node.status = '1') AND (node.type IN ('event')) AND (node.uid = '4') OR (tag.nid = node.nid))) 

Любой идеей? спасибо

+0

показать структуру таблицы и индексы – user1455836

+0

и таблица размеров. –

+0

структура это одна: узла (состояние, тип, UID, нидите, название) тега (UID, нидите) И индексы только на узел НДИ. Обе таблицы - 2 записи – Dtnand

ответ

0

Иногда or может плохо повлиять на планы запросов. Вы можете попробовать это:

SELECT n.title AS node_title 
FROM node n 
WHERE n.status = '1' AND n.type IN ('event') AND n.uid = 1 
union 
SELECT n.title 
FROM node n 
WHERE exists (SELECT t.nid FROM tag t WHERE t.uid = '1' and t.nid = n.nid); 

Для этого, чтобы работать лучше, имеют следующие два индекса:

node(status, type, uid) 
tag(uid, nid) 
+0

К сожалению, это относится к тому же времени – Dtnand

+0

Я подозреваю, что 'tag' - очень большая таблица, которая требует времени для запроса. У вас есть два индекса, которые я упоминаю? –

+0

Nope tag - очень маленький столбец с двумя записями, как я писал, что select принимает 0.0007 тоже – Dtnand

Смежные вопросы