【问题标题】:Basic question: Querying data and performance tradeoffs基本问题:查询数据和性能权衡
【发布时间】:2011-10-16 23:45:22
【问题描述】:
假设我的表中有 100 行,其中包含 3 列数字。我不需要所有的行,每次获取数据时只需要大约一半。我只希望已更新的行获取其余行是多余的。
添加一个字段并给它一个日期时间字段来表示它自我上次获取它以来已更新(并在选择时将其用作标准)是否更好?还是每次都简单地下载所有数据会更好(目前数据以 JSON 文件的形式发回)。
这两个选项在速度、带宽使用和服务器 CPU 使用方面的权衡是什么?是不是前者比后者好?
【问题讨论】:
标签:
mysql
database
json
database-design
【解决方案1】:
Jens Struwe 和 roycl 都是正确的 - 但当您提出假设性问题时,您会得到正确的答案 矛盾。
如果只有一半的数据是相关的,那么客户端将如何确定要显示哪些数据?如果决定完全可以由软件做出,那么在数据库上做会更有效率——但也更合乎逻辑。
对于 100 行的表,性能无从谈起;可维护性和长期可升级性更重要。大多数开发人员希望在数据库而不是客户端上进行逻辑数据库设计和排序/过滤。
【解决方案2】:
始终(或至少在可能的情况下)仅选择完成任务所需的数据。反之亦然:永远不要选择必须过滤掉的数据。结果:为更新添加一个时间戳字段,并仅选择时间戳大于给定行的行。
【解决方案3】:
如果您的表中有 100 行和 3 列数字,那么如果您不介意服务器是否在不到 10 毫秒的时间内返回数据,那么您使用哪种方法并不重要。这些行,如果经常查询,无论如何都会在内存中。它还使您的 json 代码更简单,您的客户端代码更笨(这可能很好,并且更易于维护)。
如果你有一个几百万行的表,只需要一小部分数据,你自然会想要限制返回集,最简单的方法是使用 SQL WHERE 子句,例如作为WHERE dt_modified > my_timestamp。在经过适当优化的数据库上,即使是这个查询也可以在 100 毫秒内完成。
问题可能更多地与数据“在线上”花费的时间有关,即客户端花费多少时间重新生成页面或根据返回的数据更新页面。客户端处理时间通常是过程中最慢的部分。只有在不同的浏览器和不同的网络速度下进行测试才能在服务器端 tweeks、网络修复(例如 gzip 压缩数据)和优化您的 javascript 调用之间找到最佳平衡。