MySql:增加分页的查询执行时间

时间:2016-10-10 09:05:22

标签: php mysql

我正在开发一个拥有大量数据的项目。数据存储在MySql Db中。 我想从几张表中获取分页记录。其中一个表有超过2百万条记录,导致页面冻结很长时间。有时页面根本无法加载。

我用来获取记录的查询:

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

如何让此查询更快地运行。因为第一次执行查询需要很长时间才能获得记录总数。

2 个答案:

答案 0 :(得分:0)

最好将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

希望这有帮助。

答案 1 :(得分:0)

您可以采取一些措施来加快速度:

  • 使用EXPLAIN确保正确设置索引/设置正确的索引。
  • 仅使用SQL_CALC_FOUND_ROWS执行复杂查询。
  • 使用TOTAL_AMOUNT语句中的HAVING别名,以避免两次计算。

MySQL会做一些优化和缓存,因此它们可能不会产生同样的影响。