Php 在数组中操作sql查询时,将sql查询作为一个sql脚本(带有内部联接)运行,而不是作为多个脚本运行

Php 在数组中操作sql查询时,将sql查询作为一个sql脚本(带有内部联接)运行,而不是作为多个脚本运行,php,mysql,performance,architecture,Php,Mysql,Performance,Architecture,我很难理解具体的事情,我将分享我的实验: 从我以前的工作中学到,CEO的指导包括:所有mysql查询必须包含我需要的参数,并一次查询所有参数以获得准确的数据,对吗?因此,如果我有一个电子商务商店,在那里我加载10个项目进行查询,这将是一个完美的工作。我的结论是——这对于我不需要一次加载大量数据的页面来说非常有用。不管我的数据库有多大。(考虑:良好实践) 我有一个网站,我必须返回(长,大,重,地狱般的)CSV报告。我编写了内部联接所需的所有查询- 但是这次我的数据库包含数百万行,我的报告循环500

我很难理解具体的事情,我将分享我的实验:

从我以前的工作中学到,CEO的指导包括:所有mysql查询必须包含我需要的参数,并一次查询所有参数以获得准确的数据,对吗?因此,如果我有一个电子商务商店,在那里我加载10个项目进行查询,这将是一个完美的工作。我的结论是——这对于我不需要一次加载大量数据的页面来说非常有用。不管我的数据库有多大。(考虑:良好实践

我有一个网站,我必须返回(长,大,重,地狱般的)CSV报告。我编写了内部联接所需的所有查询- 但是这次我的数据库包含数百万行,我的报告循环50000次(通过我拥有的每个客户),并使用内部联接从4~6个表中收集数据,每个表包含数百万行。在某些情况下,甚至会进行一些计算。当然,整个系统都是面向对象的,因此每个对象都是单个用户的(这本身就是一个查询)。 因此,我的代码对数据库进行了大量的小查询,为每个用户请求数据,在循环过程中,有大约4~6个大的内部连接查询。这需要几分钟来运行

我认为它没有意义,所以我决定用它来做实验。 我决定将所有内容分开,不将所有内容都用作“对象”,而是一次从表中获取所有数据,不使用任何连接,并通过PHP进行管理。所以我把所有有相关数据的用户都放到了1$users数组中。然后从表A获得更多数据。然后从表B获得更多数据。组织表B。从表C获得数据。对表C进行计算。ect’。再次循环,同时将我的数据匹配到一个最终数组,并输出到csv

这只花了不到1分钟的时间

它没有消耗数据库内存,而是影响了CPU。在为提高效率而重新编写代码之后,只花了不到30秒的时间。并且没有任何CPU碰撞

  • 如果我所有的代码都基于OOP,并且这种“直接”脚本编写方式工作得更快:对于特定的大而重的输出,可以继续使用它吗?(就“好的或坏的”实践而言
PS:我本来会使用汇总表,但这不是CEO现在想要的


PS2:表的索引是正确的。

关于首席执行官关于参数化查询的建议,他说这样会更快,这是正确的。添加参数可以让服务器规划查询并缓存计划以备将来使用,从而节省执行时间。它还通过正确处理任何恶意用户文本来帮助防止sql注入攻击。在单个查询中执行所有操作都是最好的,因为连接和发出查询的开销会给查询增加大量时间

我感到惊讶的是,您通过手动编码获得了如此显著的性能提升。您可能需要分析数据库结构,以确保没有更有效的方法来组织或查询数据

但是,编写自定义代码来进行数据构造是一种有效的方法,只要您愿意承担维护数据的额外责任。我假设编写和调试代码所花费的时间比编写查询所花费的时间要多得多。当需求发生变化时,可能需要相同的时间来维护它

((意见))

通常可以对查询进行足够的改进,使其比在数据库和应用程序之间来回铲取数据更快

  • 更好的指数(尤其是“综合”指数)
  • 重新格式化
    选择
  • 正常化,但不要过度正常化
  • 构建和维护“摘要”表-在某些情况下,这将使查询速度提高10倍

这个问题完全是基于意见,不适合该网站。简单地说:做适合你的事。