如何在不重复的情况下查询数据并最小化时间?

时间:2013-03-12 12:28:31

标签: mysql sql performance query-optimization

有3个实体 - articlesjournalssubscribers。如何在数据库中存储数据没有限制。 同一篇文章可以同时发表在几个期刊上。

  

如何从已订阅的期刊中选择所有已发表的文章   截止日期,没有重复?

最简单的方法:

  1. 创建包含文章的表格: 的帖子 p_idj1_idj2_idtextdate

  2. 创建一个包含订阅的表格: 的如下 f_idu_idj_id(u_id - 表用户中的用户ID)

  3. 执行:

  4. 示例查询

    select posts.* from posts inner join follows on (j_id = j1_id or j_id
    = j2_id) where u_id = 1 order by date desc
    

    此查询返回带有重复项的数据。您可以使用DISTINCTGROUP BY机制,但它会创建一个额外的排序操作来删除重复项。

    使用机制UNION可以完成另一种方式,但它也使用DISTINCT

    (select posts.* from posts inner join follows on j_id = j1_id where u_id = 1)
    union
    (select posts.* from posts inner join follows on j_id = j2_id where u_id = 1)
    order by date desc
    

    也许我按照自己的方式选择了不正确的存储结构。

    实际上问题是,是否可以对此问题采取措施,以最大限度地减少大数据所需的时间?

1 个答案:

答案 0 :(得分:0)

您可以使用以下表格结构

帖子:pid,文字,日期 期刊:jid,jtext journals_posts:jid,pid 如下:fid,uid,jid

select distinct posts.* from posts 
inner join journals_posts on journals_posts.pid = posts.pid 
inner join follows on follows.jid = journals_posts.jid 
where follows.uid = <userid>

照顾速度你可以创建索引 journals_posts(JID) 如下(UID)

您可能需要在其他字段上创建索引,并使用“explain”检查在不使用连接的情况下扫描哪些表