我一直绞尽脑汁试图解决这个问题,但似乎无法绕过它。有很多信息,但我无法做到正确。 我知道使用以下方法并不好:
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进行优化查询完全令我感到困惑。
有人可以帮忙吗?
此致
答案 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也有一个好处,用EXPLAIN
或EXPLAIN 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