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都有索引。这就成功了!谢谢你解释为什么它慢了。