mysql—在客户端而不是在查询中按日期排序sql结果

imzjd6km  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(351)

假设我有一个表跟踪一段时间内用户的权重。

CREATE TABLE `userWeights` (
  `weight_id` int PRIMARY KEY AUTO_INCREMENT,
  `user_id` int,
  `weight` float,
  `date_created` timestamp
);

这里明显的用例是一些rest端点getweights(user\ id),然后在ui上以图形的形式显示它。我将编写的标准查询类似于:

SELECT * FROM userWeights WHERE user_id=user_id ORDER BY date_created ASC

但是,既然我们是按日期排序的,那么这个用例永远不会改变的业务逻辑,排序计算负载是否可以外包给客户机的设备,从而提高sql查询的性能?对于一张1000人的表格来说,这是一个微不足道的改进吗?在这个表格中,我们存储了6个月的每日体重测量数据?

SELECT * FROM userWeights WHERE user_id=user_id
results.sort(date_created, ASCENDING); //e.g. code on android device

编辑:我这么问是因为许多云函数/云数据库主机是根据每次调用的计算时间收费的。

5tmbdcev

5tmbdcev1#

一般来说,数据库服务器上的排序要比客户端应用程序中的排序快。
在这两个场景中,数据库和客户机之间传递的数据量是相同的。唯一的区别是排序的开销。
通常,我的建议是在更强大的系统上进行排序,更接近数据。但是,如果您有充分的理由——成本考虑也是一个很好的理由——并且在客户端进行排序符合您的应用程序性能要求,那么您肯定可以考虑在客户端进行处理。

jjhzyzn0

jjhzyzn02#

客户机端和服务器端数据的实际排序性能可以忽略不计,但通常更快地接近数据(在数据库服务器上进行)。
但是,在考虑将排序放在何处时,还需要考虑一些其他事项:
可维护性—如果将逻辑放在客户端,那么添加的任何新客户端都必须实现排序逻辑。因此,如果你有一个web应用程序、ios应用程序和android应用程序,你必须确保在这三个应用程序中实现排序,以获得一致的用户体验。如果你想改变所有应用的排序,你现在必须记住在三个地方做,而如果逻辑是在一个共享api或db中,那么你可以在一个地方做改变。
可负担性-正如你所说,云提供商可以收取计算时间。如果这是一个严重的问题,您可以移动排序客户端,但正如我之前所说,未来的可维护性将受到影响,这将花费您的开发人员时间,因此在未来美元。
我建议您弄清楚导入可维护性与可承受性之间的关系,以及从长远来看,移动排序客户端是否真的有助于可承受性。

dwthyt8l

dwthyt8l3#

接吻。
添加 ORDER BY 这个问题很简单,很难搞砸。
向客户机添加排序需要更多的按键,而且更容易出错。
而且,你甚至可以不用付钱就吃蛋糕!排序可以是“免费的”:

CREATE TABLE `userWeights` (
  `user_id` int,
  `weight` float,
  `date_created` timestamp,
  PRIMARY KEY(user_id, date_created)
);

你还需要 ORDER BY 合同条款 SELECT ,但请注意,无论是在服务器上还是在客户机上,都不需要付出任何努力。
按照表定义的方式,它必须扫描整个表才能找到请求的表的行 user_id ; 这种改变也避免了这种情况。同时,这也节省了无用的空间 weight_id .
我的建议有一个问题:你不能在同一秒钟内记录两个不同的重量(这似乎是一个错误,甚至尝试!)
节省成本。。。
优化器不会因为发现数据已经排序而收取任何费用(以上)
别说了 SELECT * ,返回所有列;您只需要两个: SELECT date_created, weight .
语法问题: WHERE user_id=user_id --其中一个必须是传入的参数。否则,就等于“真”。

相关问题