优化:在哪里处理数据?数据库、服务器或客户端


Optimization: Where to process data? Database, Server or Client?

我最近一直在思考优化问题。我正在开发一个应用程序,让我思考应该在哪里处理数据,考虑平衡服务器负载、内存、客户端、负载、速度、大小等

我想更好地了解有经验的程序员在考虑处理时是如何优化代码的。采取以下3个选项:

  • 当我获取数据时,在数据库级别进行一些处理
  • 在PHP上处理数据
  • 将原始数据传递给客户端,并使用javascript进行处理

你们在什么场合更喜欢哪个?为什么?对于这个宽泛的问题,我很抱歉,如果有人能向我推荐这方面的好读物,我也会很感激。

数据库是任何应用程序的核心,因此您应该尽可能减轻数据库的负载。以下是的一些建议

  1. 只从数据库中获取必需的字段
  2. 两个简单的查询比一个复杂的查询要好
  3. 从数据库中获取数据,用PHP进行处理,然后将处理后的数据存储到临时存储中(比如缓存,例如Memcache、Couchbase、Redis)。这些数据应该设置一个到期时间,到期时间完全取决于数据的类型。缓存将在很大程度上降低数据库负载
  4. 数据以规范化的形式存储。但是,如果您事先知道将要请求数据,并且生成这些数据需要来自多个表的联接,那么预先处理的数据可以存储在单独的表中,并可以从该表中提供
  5. 在客户端发送尽可能少的数据。较小的HTML大小将节省带宽,浏览器将能够快速呈现页面
  6. 按需加载数据(使用ajax、延迟加载等),例如,在用户单击选项卡之前,图像在页面上不可见,该图像应在用户单击时加载

两个想法:计算机应该工作,人们应该思考。(20世纪60年代的IBM广告。)

"过早的优化是编程中所有邪恶(或者至少是大多数邪恶)的根源。"——唐纳德·克努思

除非你正在或计划成为谷歌、亚马逊或脸书,否则你应该专注于功能。"先让它发挥作用,然后再让它快速发展。"如果你计划发展到这个规模,那就按照他们的做法:用硬件解决问题。它更便宜,也更有可能有效。

编辑后添加:由于您在服务器上控制处理能力,但可能不在客户端上,因此通常最好将密集任务放在服务器上,尤其是在客户端可能是移动设备的情况下。但是,请考虑网络延迟、带宽要求和响应时间。如果你可以通过在客户端上处理来提高响应时间,那么就考虑这样做。因此,优化用户体验,而不是CPU周期;你可以在需要的时候购买更多的CPU周期。

最后,请记住,客户端是不可信任的。因此,的某些东西必须在服务器上。

因此,根据经验,尽可能多地处理数据库中的数据。创建一个新的查询连接的成本非常高,所以您希望尽可能地限制它。即使您必须编写一些非常难看的SQL,执行一个JOIN几乎总是比执行两个SELECT语句快。

PHP实际上应该只用于格式化和缓存数据。如果您在每次请求后都要执行大量的数据操作,那么您可能会以不太实用的格式存储数据。您希望使用Redis或APCu之类的东西,在几乎准备好服务器的状态下缓存任何未更改的内容。

最后,客户端不应该对多个对象执行数据操作。您永远不知道客户端资源的可用性,因此始终保持客户端数据精简。在后端对任何大于几十个的数据集执行分页和排序。使用AngularJS的AJAX请求通常与在iPad2上对100多个项目执行排序一样快。

如果你想了解这个答案的任何方面的更多细节,请询问,我会尽我所能提供例子或更多细节。