簡體   English   中英

MySql:增加查詢的分頁執行時間

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM