Php 执行此子查询的更好方法

Php 执行此子查询的更好方法,php,mysql,sql,performance,Php,Mysql,Sql,Performance,假设我有这样一个疑问: <? $qi = $db->prepare('SELECT one.id, one.Value, two.Name, three.nfid, temp.Name AS Alias FROM one INNER JOIN two ON one.fid = two.id LEFT OUTER JOIN three ON two.fid = three.fid LEFT

假设我有这样一个疑问:

<?
     $qi = $db->prepare('SELECT one.id, one.Value, two.Name, three.nfid, temp.Name AS Alias
           FROM one
           INNER JOIN two ON one.fid = two.id
           LEFT OUTER JOIN three ON two.fid = three.fid
           LEFT OUTER JOIN (SELECT id,Name FROM two) AS temp ON three.nfid = temp.id
           WHERE one.rid = ?
           ORDER BY one.id ASC');
      $qi->execute( array( $id ) );
?>

表之间的连接为:

one包含许多行,其中包含字段
one.Value
one.rid
one.fid

fid
是与表two的连接,其中包含项目的
two.Name
one.fid
=
two.id

但有时该项是另一项的别名,这就是表three存在的原因。它包含字段
three.fid
three.newfid
,其中
three.newfid
=
two.id
(但对于另一个项目,另一个
two.Name

该查询应该使用某个
one.rid
one中获取所有行,并获取
one.Value
two.Name
,如果此
one.fid
存在
three.fid
two.Name
并将其命名为别名

有没有办法改进此查询或以其他方式解决问题?也许要改变数据库的布局?目前相当缓慢。这里的例子已经简化,使之更一般


谢谢。

括号中的子查询迫使MYSQL忽略其索引,这会花费很长时间。最好直接将两个连接为temp。只要你总是把两个[field]和temp[field]放在一起,就能很好地把它们区分开来

  SELECT one.id, one.Value, two.Name, three.nfid, temp.Name AS Alias
  FROM one
  INNER JOIN two ON one.fid = two.id
  LEFT OUTER JOIN three ON two.fid = three.fid
  LEFT OUTER JOIN two AS temp ON three.nfid = temp.id
  WHERE one.rid = ?
  ORDER BY one.id ASC

您使用哪种数据库引擎?你有索引吗?MySQL和是的,id、rid、fid和newfid都有索引。这就成功了!谢谢你解释为什么它慢了。