[英]MySql : Increase query execution time for pagination
我正在開發一個包含大量數據的項目。 數據存儲在MySql Db中。 我想從幾個表中獲取帶有分頁的記錄。 該表之一具有超過200萬條記錄,這導致該頁面凍結了很長時間。 另外有時頁面根本無法加載。
我用來獲取記錄的查詢:
SELECT
EN.`MRN`,
P.`FNAME`,
P.`LNAME`,
P.`MI`,
P.`SSC`,
sum(EN.`AMOUNT`) AS `TOTAL_AMOUNT`
FROM `table_1` AS EN
INNER JOIN `table_2` AS P ON EN.`MRN` = P.`MRN`
GROUP BY EN.`MRN`,P.`FNAME`, P.`LNAME`,P.`MI`,P.`SSC`
HAVING sum(EN.`AMOUNT`) > 0
ORDER BY P.`LNAME`
通過此查詢,我得到了可以進行分頁的記錄總數。 然后我再次運行此查詢以獲取實際記錄:
SELECT
EN.`MRN`,
P.`FNAME`,
P.`LNAME`,
P.`MI`,
P.`SSC`,
sum(EN.`AMOUNT`) AS `TOTAL_AMOUNT`
FROM `table_1` AS EN
INNER JOIN `table_2` AS P ON EN.`MRN` = P.`MRN`
GROUP BY EN.`MRN`,P.`FNAME`, P.`LNAME`,P.`MI`,P.`SSC`
HAVING sum(EN.`AMOUNT`) > 0
ORDER BY P.`LNAME`
LIMIT 0, 100
如何使該查詢更快地工作。 因為需要很長時間,所以第一次執行查詢才能獲得記錄總數。
最好將total_amount
與查詢分開,因為這是涉及所有記錄的唯一值。 您可以在加載頁面時調用它。 我假設您在table_1
中的所有記錄都是有效的。
SELECT sum(EN.`AMOUNT`) AS `TOTAL_AMOUNT` FROM `table_1` AS EN
HAVING sum(EN.`AMOUNT`) > 0
然后,每次翻轉頁面時都會獲得查詢結果。 這只應返回從記錄0開始的10條記錄。
SELECT
EN.`MRN`,
P.`FNAME`,
P.`LNAME`,
P.`MI`,
P.`SSC`
FROM `table_1` AS EN
INNER JOIN `table_2` AS P ON EN.`MRN` = P.`MRN`
GROUP BY EN.`MRN`,P.`FNAME`, P.`LNAME`,P.`MI`,P.`SSC`
HAVING sum(EN.`AMOUNT`) > 0
ORDER BY P.`LNAME`
LIMIT 10 OFFSET 0
希望這可以幫助。
您可以采取以下措施來加快速度:
EXPLAIN
確保您的索引設置正確/設置正確的索引。 SQL_CALC_FOUND_ROWS
僅執行一次復雜的查詢。 HAVING
語句中使用TOTAL_AMOUNT
別名,以避免兩次計算。 MySQL將進行一些優化和自身緩存,因此它們可能不會產生相同的影響。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.