mySql INNER JOIN混乱

时间:2015-07-08 15:00:34

标签: php mysqli

我一直绞尽脑汁试图解决这个问题,但似乎无法绕过它。有很多信息,但我无法做到正确。 我知道使用以下方法并不好:

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 个答案:

答案 0 :(得分:1)

子选择和in array子句总是很慢。

尝试:

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也有一个好处,用EXPLAINEXPLAIN EXTENDED运行你的选择来检查索引是否存在并且是否正确使用。

<强>更新 要检查带有explain前缀的页面,请按以下方式查询:

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