0

标题可能有点不清楚,但我会解释:

以下查询:

SELECT DISTINCT t.something FROM table1 as m  LEFT JOIN table2 as t ON
t.id = m.id  LEFT JOIN table3 as c ON t.id = c.id  WHERE ... LIMIT
1000;

限制为 1000。现在这是特定操作中执行的唯一查询,现在安装了 Zend 调试工具,当我查看在该页面上执行的 sql 查询时,我看到该查询与以下查询一起执行1000 次(对于结果中的每一行 1 次,每行的 id:

SELECT "table1".* FROM table1 WHERE ((("table1"."id" = *id*)))

这使得页面的性能真的很慢,我认为所有这些查询都是不必要的,所以我正在寻找一个解决方案,这样所有这些查询都不再执行,性能会更好。

有谁认识这种情况?

PS:也许很高兴知道我将 Postgresql 与 Zend 框架一起使用

4

1 回答 1

1

这更像是一个古老的谜题,一个人必须猜出他的方式,而不是程序员的问题。

您似乎需要的不仅仅是something页面,但您的查询只检索something. 然后,您的智能应用程序会单独获取每一行 - 性能灾难。

我还猜想,您在问题中提供的查询是错误的(除了效率低下),应该阅读:

SELECT DISTINCT m.something
FROM   table1 as m
LEFT   JOIN table2 as t ON t.id = m.id
LEFT   JOIN table3 as c ON t.id = c.id
WHERE  ...
LIMIT  1000;

..这可能仍然是胡说八道,这取决于您对我们隐瞒的实际WHERE条款。

要使用有意义的表别名检索整行(或仅您需要的列):

SELECT DISTINCT t1.*
FROM table1 t1
LEFT JOIN table2 t2 ON t2.id = t1.id
LEFT JOIN table3 t3 ON t3.id = t2.id
WHERE ...
LIMIT 1000;

table1为了更有效地做同样的事情(假设一开始没有骗子):

SELECT t1.*
FROM   table1 t1
WHERE EXISTS (
    SELECT 1 
    FROM   table2      t2
    LEFT   JOIN table3 t3 USING (id)
    WHERE  ON t2.id = t1.id
    )
AND ...
LIMIT 1000;
于 2012-12-26T09:22:57.263 回答