标题可能有点不清楚,但我会解释:
以下查询:
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框架一起使用答案 0 :(得分: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;