우리는 우리의 응용 프로그램 중 하나를 PostGreSQL에서 MySQL로 전환하고 있습니다.데이터베이스의 총 레코드 수를 계산하지만 X 레코드 만 반환합니다
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;
일부 필드의 변화가있다하지만,에 - MySQL의 광고에이 쿼리이 함께 와서 우리는 포트에 노력하고있다
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;
- 우리는 POSTGRES에서 다음 쿼리를 모든 의도 된 기능은 동일해야합니다.
PostGreSQL에 OVER()
이라는 전화가 있음을 알 수 있습니다. 쿼리하는 테이블에는 많은 데이터가 있습니다. 따라서 사용자에게는 150 개의 레코드 만 표시되지만 모든 레코드의 개수를 알려줍니다. PostGres를 사용하면 단일 호출을 통해이 작업을 수행 할 수 있지만 MySQL에는 OVER()
함수가 없습니다.
데이터베이스를 다시 쿼리하는 것 외에 다른 대안이 있습니까? 데이터베이스에 대한 두 번째 쿼리는 응답 시간을 최소 15 초 이상으로 늘리고 때로는 시간을 초과하는 경우도 있습니다.
'SQL_CALC_FOUND_ROWS를 SELECT ...'하나 개의 쿼리의 결과를 얻을 수있는 한 가지 방법을 (다중 결과 세트를 지원하는 클라이언트)는 저장된 프로 시저에서 두 개의 쿼리를 모두 래핑하는 것입니다. 나는 "페이지 당 행 수"및 "페이지 수"를 인수로 사용하고 제한 및 오프셋을 설정하고 총 행 수와 함께 두 번째 결과 집합을 반환하도록 수학을 수행하며 귀찮은 계산을 수행합니다. "페이지 번호"가 처음 (항상 1 개), 이전, 현재, 다음 및 마지막 인 항목을 앱에 알립니다. –