我想优化这个查询(因为子查询通常不快),但是我迷失了方向,因为我不能使用连接重写它,这样会更好地提高性能,你能帮我解决这个问题吗?

SELECT id, company, street, number, number_addition, postalcode, telephone
FROM clients
    WHERE (postalcode BETWEEN '1000' AND '9000') AND street = (
        SELECT DISTINCT street FROM clients WHERE (postalcode BETWEEN '1000' AND '9000') AND postalcode <= (
            SELECT MIN(postalcode) FROM clients WHERE street = 'Main Street' AND     (postalcode BETWEEN '1000' AND '9000'))
        ORDER BY postalcode DESC LIMIT 1, 1)
ORDER BY postalcode DESC, street DESC, number DESC, number_addition DESC, telephone DESC
LIMIT 1

谢谢你们的时间。

最佳答案

SELECT DISTINCT street ORDER BY postalcode没有意义(我认为这不是有效的ansi sql),除非postalcode在功能上依赖于street-我认为这不是,因为你在主街的内部子选择上获得最低的postalcode是没有意义的。mysql会让你摆脱它,但是结果会不一致。你想说什么?
我认为这不应该特别慢,因为您拥有的不是依赖子查询;子查询只执行一次,而不是对每一个外部行重复执行。您可以将其重写为三个单独的查询-
在大街上买最低的邮费;
获取邮政编码低于(1)的第二高街道(不一致);
获取街上客户的详细信息(2)。
在执行上没有区别。(实际上,为了清楚起见,最好这样做。)
您可以将它们重写为joins,使用less is null上的self left joins来获得minima/maxima,但我认为对于这个示例,您不会从中获得任何好处,而且考虑到两个级别的join和第二个最高要求,它会变得非常混乱。这个问题在实践中是不是特别慢?EXPLAIN看起来像什么?您是否编制了postalcodestreet索引?

10-04 10:37
查看更多