2013-09-29 31 views
0

如果我要为特定的实体创建状态/消息更新的页面,有没有更好的办法做到这一点比这个子句:是“凡在” 1000份太多

  1. GET您关注/订阅的所有实体
  2. 在状态表上执行WHERE IN。

我担心的是:如果您遵循1000,2000个实体,该怎么办?那是问题吗?什么是做这种数据检索的最佳方式?

+1

您可以让数据库索引做没有廿四两个步骤通过做一个子查询来旅行。这也可能让数据库引擎以某种方式对其进行优化。 – icktoofay

+3

Oracle特别限制了1000个元素的'IN'子句。这是更好地完成表和JOIN – 2013-09-29 03:17:50

+0

我同意JOIN(也许隐式写为子查询)。除了相关的限制之外,许多数据库实现对性能下降之前可以提供给“IN”的值的数量有“最佳”限制。 – user2246674

回答

1

你的计划是(可能)不是一个好的计划。一般来说,WHERE IN只有在项数很小且不变时才是好的。

大多数WHERE IN子句可以转换为连接,这听起来没有什么不同。
试试这个(猜测模式):

SEKECT s.* 
FROM followed f 
JOIN status s ON s.entity_id = f.entity_id 
WHERE f.user_id = ? 

编码像这样会给性能好,只要你有followed(user_id)status(entity_id)

+0

我同意使用连接的所有建议。不知道我是否有理由不使用它。但是,这导致我另一个问题。你知道优化状态/消息检索的方式/策略吗?该页面将分页,我只会对最近的项目感兴趣。 –

+1

只需对查询执行ORDER BY和LIMIT。 – Thomas

+0

在您的示例中,当状态表增长时,查询需要一段时间才能运行(1.3 +秒,在具有200,000行的测试表中获得20行以上)。我有和id列上的索引。 –