我们正在将我们的一个应用程序从PostGreSQL转移到MySQL。我们在 PostGres -
中有以下查询SELECT
idrte
, left_name
, gacodemun
, clsrte
, speed
, speed_override
, ST_AsGeoJSON(geometry) AS geometry
, count(idrte) OVER() AS total
FROM
aq_routes
WHERE
ST_CONTAINS(
GeomFromText(
'Polygon(($geom))'
),geometry)
GROUP BY
idrte
, left_name
, gacodemun
, clsrte
, speed
, speed_override
, geometry
ORDER BY left_name
LIMIT 150;
我们正试图将此查询移植到 MySQL 广告已经提出这个 -
SELECT
id AS id
, left_name AS left_name
, left_locality AS left_locality
, class AS class
, speed AS speed
, speed_override AS speed_override
, AsWKB(Geom) AS geom
, count(id) AS total
FROM road_segments
WHERE
CONTAINS(
GeomFromText(
'Polygon(($geom))'
),geom)
GROUP BY
id
, left_name
, class
, speed
, speed_override
, geom
ORDER BY left_name
LIMIT 150;
有一些字段更改,但总的来说,预期的功能是相同的。
你会注意到PostGreSQL中的OVER()
调用。我们查询的表有很多数据。因此,对于用户,我们只显示150条记录,但告诉他所有记录的计数。使用PostGres,这可以通过一次调用实现,但我们在MySQL中没有OVER()
函数。
除了第二次查询数据库之外,还有其他什么选择。对数据库的第二个查询是将响应时间增加至少15秒,有时甚至超时。
答案 0 :(得分:2)
我认为您要使用FOUND_ROWS()
和CALC_FOUND_ROWS()
。您可以查看文档here。
基本理念是:
select CALC_FOUND_ROWS id, . . .
. . .
然后使用函数FOUND_ROWS()
将值返回给应用程序。
不幸的是,要将此值作为列值,我认为您需要运行查询两次,基本上:
select . . ., x.cnt
from . . . cross join
(select count(*) as cnt from <your query here>) x
. . .