Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 我应该使用更受约束的SQL查询还是在代码中处理结果集?_Php_Mysql_Performance_Theory - Fatal编程技术网

Php 我应该使用更受约束的SQL查询还是在代码中处理结果集?

Php 我应该使用更受约束的SQL查询还是在代码中处理结果集?,php,mysql,performance,theory,Php,Mysql,Performance,Theory,我是一个非常新的PHP开发人员,但对T-SQL有一些很好的经验,因此我完全有能力构建一些漂亮的SQL查询。我正在开发一个PHP应用程序,并且在很多场合遇到过这个问题 当我遇到需要从MySQL数据库中提取数据并通过PHP处理输出的问题时,我应该简单地“*”出整个结果集并通过PHP选择我需要的内容吗?在我看来,尽可能多地使用SQL更有意义,但我不知道 在性能和“最佳实践”方面,通常是最佳的;依靠MySQL完成大部分工作,让PHP完成输出,或者让PHP完成大部分工作?如果不需要表中的所有列,请明确指定

我是一个非常新的PHP开发人员,但对T-SQL有一些很好的经验,因此我完全有能力构建一些漂亮的SQL查询。我正在开发一个PHP应用程序,并且在很多场合遇到过这个问题

当我遇到需要从MySQL数据库中提取数据并通过PHP处理输出的问题时,我应该简单地“*”出整个结果集并通过PHP选择我需要的内容吗?在我看来,尽可能多地使用SQL更有意义,但我不知道


在性能和“最佳实践”方面,通常是最佳的;依靠MySQL完成大部分工作,让PHP完成输出,或者让PHP完成大部分工作?

如果不需要表中的所有列,请明确指定所需的列。这在性能方面更好,更不用说它更具可读性。

SQL几乎总是比PHP产生更好的性能,但这实际上取决于正在运行的查询。它越复杂,SQL就越有可能成为更好的答案。SQL是围绕着“快速获取正确的数据”而构建的,而PHP是围绕着一种通用脚本语言而构建的。

您通常不应该应用通配符来获取所有列。更好的做法是只检索您感兴趣的列。这涉及到:

  • 性能:只获取和检索所需的数据,从而减少开销
  • 可维护性:查询获取的内容更为明显。也就是说,如果向结构中添加额外的列,则可能会获得最初没有预料到的数据

通常,返回特定列被认为是最佳实践。性能不是一个很大的问题,除非您处理的是包含BLB的表(还考虑表是否在将来有一个表),但是您可能会发现处理较小的返回对象更容易。
当然,如果您处于开发模式,而不是维护模式,那么如果您经常添加或删除列,您可能会发现选择*更可取。

根据我的经验,收集*查询或特定字段查询的访问时间与总体请求时间相比相形见绌,至少如果这是通过web完成的

IE在我对美国和海外网站的测试中,我通常认为select fld、fld、fld和select*之间的差异可以忽略不计,除非你有大表行和很多行

我个人认为这有点像是一个判断调用,它基于系统的大小、表以及表和列是否处于任何形式的变化状态。如果我是你,我不知道你的系统的大小,我会选择select*但很明显这不是“最佳实践”,但我认为它确实需要以特定的系统为基础


我目前是一个庞大的C#、WCF、WPF、SQL项目团队的成员,无论他们走到哪里,都有“最佳实践”,我们所拥有的都是一团混乱。在某些情况下,为了遵循最佳实践付出了太多的努力,结果是需要付出更多的工作来维护它。我们有无数的接口,还有包装器、适配器、unity等等。现在做一个小改动,它涉及15-20个文件。我意识到这有点离题,但不要因为最佳实践就盲目地遵循它。

请详细说明一个查询要比PHP慢多少“复杂”。根据我的经验,PHP通常比SQL快一点。。但可能我的查询需要优化,或者我使用了太多的连接?:S@mmmshuddupMySQL在分组/排序/过滤功能方面通常会更快。如果不是这样的话,您可能是做错了什么。如果您希望模式在将来发生更改,那么最佳做法是什么?使用*时,它将获取所有新字段,或者不尝试获取SQL查询中显式定义的已删除字段。首先通过信息模式查询获取字段,然后动态地向查询提供字段名称?我的观点是您希望尽可能明确。如果您重新定义了表结构,那么不可避免地应该更改查询。通过使用通配符,您可能会允许不太明显的bug潜入。我怀疑永远不会存储blob。