半径范围内的结果 - 优化缓慢的MySQL查询

时间:2018-03-22 17:29:46

标签: mysql

SELECT property.paon, property.saon, property.street, property.postcode, property.lastSalePrice, property.lastTransferDate,
 epc.ADDRESS1, epc.POSTCODE, epc.TOTAL_FLOOR_AREA,  
        (
            3959 * acos (
                cos (radians(54.6921))
                * cos(radians(property.latitude))
                * cos(radians(property.longitude) - radians(-1.2175))
                + sin(radians(54.6921))
                * sin(radians(property.latitude))
            )
        ) AS distance 
        FROM property 
        RIGHT JOIN epc ON property.postcode = epc.POSTCODE AND CONCAT(property.paon, ', ', property.street) = epc.ADDRESS1 
        WHERE property.paon IS NOT NULL AND epc.TOTAL_FLOOR_AREA > 0
        GROUP BY CONCAT(property.paon, ', ', property.street)

        HAVING distance < 1.4 
        ORDER BY property.lastTransferDate DESC
        LIMIT 10

表属性有2200万行,表epc有1400万行

没有GROUP BY和ORDER BY,它会快速运行。

属性表通常具有多次相同的属性,但我需要选择具有最新lastTransferDate的属性。

如果有更好的方法,我愿意接受它

以下是查询说明: Query-Explain-Image

2 个答案:

答案 0 :(得分:1)

你可以做一些事情:

  • 创建一个新列,这样您就不需要在CONCAT(property.paon, ', ', property.street)GROUP BY中使用CONCAT JOIN(这会加快它的速度!)
  • 正如JackHacks所说,你需要在正确的位置创建索引。 (属性邮政编码和新创建的列,以及epc邮政编码和地址)
  • 使用HAVING删除epc.TOTAL_FLOOR_AREA > 0并将其添加到WHERE

如果您需要更多帮助,请与我们分享您的查询。

答案 1 :(得分:0)

你控制数据库吗?如果这样做,您可以尝试在地址和邮政编码列上添加索引(join子句中的任何内容)。这应该可以加快查询速度。

编辑:重读您的问题。

如果GROUP BY和ORDER BY子句正在减慢速度,我会尝试在这些子句中引用的列上添加索引。