我正在努力研究如何编写足够快的代码来完成手头的任务,但是结构也很好,以便将来可读和可维护。
任务是在php中生成一个销售报告,该报告利用来自SQL数据库的数据。此报告返回数千行,每行代表一次销售。报告的许多列必须在生成报告时计算,因为它们的值未存储在数据库中。我编写了一个大型SQL查询,可以很快地一次性生成报告。
我的问题是这会造成代码重复,此外,有人根据系统实体理解SQL代码将非常困难。例如,我在我的函数库中有一个函数,它返回销售收到的金额。它调用以下SQL来实现。
SELECT SUM(amount) AS amount_received
FROM transactions
WHERE
tran_status = 'Success' AND
booking_id = $booking_id
创建报告时,在我从数据库中获得数千笔销售后,为每次单独销售调用此功能的速度太慢。因此,我将以下内容加入到我的SELECT语句中,以便销售从数据库到达amount_received列。
SELECT booking_id, SUM(amount) AS amount_received
FROM transactions
WHERE tran_status = 'Success'
GROUP BY booking_id
在编写此报告时,我已经使用了许多不同的系统概念,并且我知道在不止一个地方定义这些关键概念是危险的,甚至我也很难阅读我的大量SQL查询。任何建议将不胜感激。
这是我的第一个问题,如果我做错了就很抱歉...
答案 0 :(得分:0)
在pma中使用前导字符串“EXPLAIN”显示完整查询并执行完整查询;
答案 1 :(得分:0)
它看起来像是一个N + 1查询问题。无论您做什么,报告都将成为一个单独的实体,并且需要额外的框架。考虑为单个对象查询创建集合驱动的替代方案,并将它们插入多个对象集,无论是数组还是您选择的结构。使其足够灵活,可以接收大量ID,然后将这些ID传递给各种组件以获取数据。然后你可以迭代巨大的集合来计算你需要的东西。注意:这种方法非常耗费内存,因为在触摸它之前存储了大量数据,输出它等等。我建议返回结果集而不是填充数组 - 无论如何SQL服务器都会使用该内存。
通过这种方式,您可以获得定义,获得更快(但仍然不是最佳)的解决方案,然后报告是关于如何运行哪些结果集以及报告的页面组成的对象。