当前位置: 首页 > 知识库问答 >
问题:

提要算法+数据库:不是行太多就是检索太慢

夹谷俊远
2023-03-14
    null

我这样做的方法是创建太多的行,而且看起来不是可伸缩的。例如,如果一个页面创建了一个post&有1,000,000个followers,那么我们就在feedpost表中创建了1,000,000个新行。

请救命!像facebook这样的公司是如何处理这个问题的呢?他们会根据请求生成提要吗?我的数据库关系很糟糕吗?

共有1个答案

冯枫
2023-03-14

这并不是说原始模式本身会有本质上的错误,至少不是基于您提供的高级描述。缓慢的原因是您没有以应该访问关系数据库的方式访问数据库。

一般情况下,在查询关系数据库时,应该在可能的情况下使用联接和数据库内排序,而不是获取一堆数据,然后在代码中尝试连接相关对象并对其进行排序。如果让数据库为您做这一切,它会快得多,因为它可以利用索引,并且只访问那些实际需要的对象。

根据经验,如果您需要对Python代码中的queryset的结果进行排序,或者循环访问多个查询集并以某种方式组合它们,那么您很可能做错了什么,您应该弄清楚如何让数据库为您做这件事。当然,这不是每一次都是真的,但肯定是经常的。

让我试着用一段简单的代码来说明。假设您有以下模型:

class Page(models.Model):
    name = models.CharField(max_length=47)
    followers = models.ManyToManyField('auth.User', related_name='followed_pages')

class Post(models.Model):
    title = models.CharField(max_length=147)
    page = models.ForeignKey(Page, related_name='posts')
    content = models.TextField()
    time_published = models.DateTimeField(auto_now_add=True)

例如,您可以通过以下单行代码获得当前登录用户发布到页面的最近20篇文章的列表:

latest_posts = Post.objects.filter(page__followers=request.user).order_by('-time_published')[:20]

这将对数据库运行一个SQL查询,它只返回(最多)20个匹配的结果,而不返回其他结果。而且由于连接的是所有相关表的主键,它将方便地为所有连接使用索引,从而使其非常快速。事实上,这正是关系数据库被设计用来高效执行的操作。

 类似资料:
  • 为了添加另一个信息,我有一个tasks表,它当然需要引用来跟踪分配给谁,我还有一个列跟踪创建任务的用户。这将分别是和。 虽然有更多的表引用回该键。我可能已经有8个推荐人了。我相信到目前为止我已经把它设计得很好了,但是根据我所提到的,这听起来好吗?

  • 我收集了300万份文件,索引如下: {ts:1},{u\u id:1} 请注意,这是两个单独的升序索引,而不是复合索引。 当我运行此查询时: db.collection.find({u_id:'user'})。排序({ts:-1})。跳过(0)。限制(1) 需要100毫秒。我有以下日志: 2017-04-15T06:42:01.147 0000 I命令[conn783]查询。集合查询:{order

  • 问题内容: 我花一些时间来优化当前数据库。 我正在专门查看索引。 有几个问题: 索引太多了吗? 索引将加速什么? 索引会减慢什么? 什么时候添加索引是个好主意? 什么时候添加索引是个坏主意? 多个索引与多列索引的优缺点 问题答案: 索引将加速什么? 数据检索-SELECT语句。 索引会减慢什么? 数据操作-INSERT,UPDATE,DELETE语句。 什么时候添加索引是个好主意? 如果您想获得更

  • https://blog.csdn.net/xiaoyi5224765/article/details/115706271 为什么这个Sentinel的 漏桶算法 限流 RateLimiterController 的实现中: 期望时间小于当前时间 则放行, 这个代码存在并发的情况,怎么他还 is ok? 这玩意是不是不准? 没保证只有一个线程成功更新latestPassedTime。 b

  • 问题内容: 假设我有一千个键,并且我想存储关联的值。直观的方法似乎像 对于Elasticsearch索引具有数千个键来说,这是一种不良的设计模式吗?以这种方式引入的每个键都会为索引下的每个文档增加开销吗? 问题答案: 如果您知道键数有上限,那么几千个字段就不成问题。 问题是当您拥有一组无限制的键时,例如,当键是从一个值派生时,因为您将拥有一个不断增长的映射关系以及簇状态。它还可能导致奇怪的搜索。