我有一个包含1000条记录的数据库表。
我现在有两个选择将它们显示给我的用户。
选择1)一次选择全部并显示。
选择2)加载更多:使用限制在开头选择20行,并在用户向下滚动时加载下一行
现在我的问题是哪个是更好的选择? 第二种选择会改善性能吗? 查询速度是否取决于必须返回的行数?
当然我已经索引了所需的列。
答案 0 :(得分:2)
对于数据库,两个选项同样很慢。
让我们解释一下为什么。
选择1)一次选择全部并显示。
这将花费一些时间通过网络发送,并且很可能在浏览器解析数据之前一段时间。 1000个记录实际上并不是那么大,所以它很可能会很快 - 但是,如果你的记录随着时间的推移而增长,那么这条规则将无法阻止。
选择2)加载更多:使用限制在开头选择20行,在用户向下滚动时在下一步加载
我在这里假设你要使用LIMIT 20 OFFSET X
- MySQL会做的是找到满足条件的所有记录,缓冲它,找到20条记录并丢弃X记录。它基本上和你选择的工作相同1.通常,为了帮助MySQL,我们使用索引和一些技巧来帮助它减少必须经历的数据集 - 我不会详细讨论它。
最后一部分是 - 这是在性能方面永远记住 - 让某些东西快速工作意味着让它工作 less 。如果您返回20行数据而不是10行,则表示您基本上完成了两次工作。
性能方面的另一个方面是找到令人满意的权衡。例如,10或20行实际上可以忽略不计。如果考虑到目前可用的网络带宽,即使1000行也不是那么多数据。我们开发人员必须做的是为我们的服务器和客户端(大多数情况下是浏览器)找到最少的工作。如何找到它,如果找到它,取决于您在构建应用程序和底层基础架构时的判断和选择。
但是,要回到原来的问题 - 发送1000行通常会慢一些,因为网络必须发送更多数据,用户必须一次接收更多数据。一次发送10或20个数据库的速度很慢,但对于网络/浏览器来说却相当快捷。这取决于你决定选择的目标。
答案 1 :(得分:0)
在这种情况下,最好显示所有行。通常,遵循的一个好规则是在服务器上缓存大量数据,并从该列表中提取。然后当该列表接近用完时,如果用户继续前进,则从数据库中异步拉出更多。
原因是对数据库进行查询的最重要部分之一实际上是连接到数据库。这是与sql查询中的连接相比,代码中的连接不良的原因之一(另一个原因是数据库针对数据聚合进行了优化,而代码针对业务逻辑进行了优化)。