2015-07-08 8 views
0

Я долгое время ломал мозги, пытаясь понять это, но просто не может показаться, что я обволакиваю его. Там много информации, но я не смог понять это правильно. Я понимаю, что, используя следующий метод не является хорошим:mySql INNER JOIN Confusion

WHERE ID IN (SELECT .....

Я пытаюсь оптимизировать запрос ниже, как у меня много этого типа в одном сценарии и делает страницу ужасающе медленно:

$res = mysqli_query($DB, 'SELECT * FROM nde WHERE id IN (SELECT relto FROM ft_n_rel WHERE rel_fr = '.$DB->real_escape_string($rid).' AND rel_ty = '.$DB->real_escape_string($FA).') LIMIT 1'); 

Попытка сделать этот запрос оптимизирует с INNER JOIN полностью озадачивает меня

Может кто-нибудь помочь

.?

С уважением

+1

проверить свои показатели, это может привести к этим проблемам – daremachine

ответ

1

Подвыборы и in array статьи всегда очень медленные.

Try:

SELECT n.* 
FROM nde n 
    INNER JOIN ft_n_rel f ON n.id = f.relto 
WHERE f.rel_fr = '.$DB->real_escape_string($rid).' 
    AND f.rel_ty = '.$DB->real_escape_string($FA).' 
LIMIT 1 

@daremachine имеет хорошую точку, а, запустите ваш выбор с EXPLAIN или EXPLAIN EXTENDED, чтобы проверить, если индексы существуют и используются правильно.

Update Чтобы проверить страницу с префиксом объяснить вам запрос следующим образом:

EXPLAIN 
SELECT n.* 
FROM nde n 
    INNER JOIN ft_n_rel f ON n.id = f.relto 
WHERE f.rel_fr = '.$DB->real_escape_string($rid).' 
    AND f.rel_ty = '.$DB->real_escape_string($FA).' 
LIMIT 1 
+0

это, вероятно, лучшее ваши собираемся получить. «Предел 1» был необходим в вашем подзапросе, потому что вам нужно было вернуть только один результат, он не функционирует одинаково здесь, поэтому он может и не понадобиться. Тем не менее я не знаю намерений запроса, поэтому, возможно, вам нужен единственный результат, если вы захотите заказать результаты запроса, чтобы узнать, какой результат вы будете возвращать. – mgrenier

+0

На самом деле 'LIMIT 1' не является частью подзапроса (в том числе в исходном запросе). – Mark

+0

ах, вы правы кронштейн раньше, мой плохой – mgrenier