我正在开发一个拥有大量数据的项目。数据存储在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
如何让此查询更快地运行。因为第一次执行查询需要很长时间才能获得记录总数。
答案 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会做一些优化和缓存,因此它们可能不会产生同样的影响。