0
我們正在將我們的應用程序之一從PostgreSQL遷移到MySQL。我們在POSTGRES下面的查詢 -統計數據庫中的記錄總數,但只返回X記錄
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秒,有時甚至超時。
'SELECT SQL_CALC_FOUND_ROWS ...'得到的結果在一個查詢的一種方式(使用支持多個結果集的客戶端)將兩個查詢包裝在存儲過程中。我有一個我使用的接受「每頁行數」和「頁碼」作爲參數,爲你做數學運算,以便設置限制和偏移量,並返回第二個結果集的總行數,並做一些可愛的含糖計算告訴應用程序什麼「頁碼」是第一個(當然總是1),前一個,當前,下一個和最後一個。 –