哪一个更适合表现?交叉加入还是新表?

时间:2011-03-26 05:07:09

标签: mysql performance join

我正在构建一个面部匹配Web应用程序。

注意:我发现人们并没有将这种类型的应用程序称为facematch应用程序。

这是一个基本的工作流程。

  1. 用户上传照片
  2. 管理员批准/拒绝照片
  3. 当用户访问该页面时,会从数据库中随机选择两张照片。
  4. 用户有两个选择
    1. 选择其中一张照片
    2. 跳到另一场比赛
  5. 有一个条件。用户看不到重复的匹配。如果用户已经玩过1比2,那么用户再次看不到2比1。

    假设我有以下4张照片

    桌面照片

    id
    1
    2
    3
    4
    

    有6种可能的匹配。那些是

    1 vs 2
    1 vs 3
    1 vs 4
    
    2 vs 3
    2 vs 4
    
    3 vs 4
    

    为了进行这些匹配,我使用以下交叉连接查询。

    select p1.id, p2.id from photos as p1 cross join photos as p2 where p1.id < p2.id
    

    它没有问题。我担心的是,随着比赛数量的增加,它会变慢。

    我只用2000张照片获得了1999000场比赛。这是一个巨大的数字。

    所以我考虑了一个解决方案,然后创建了一个存储所有可能匹配项的新表。管理员批准照片时会创建行。

    表格匹配

    id1 id2
    1    2
    1    3
    1    4
    and so on
    

    最后,我的问题是

    我应该继续使用交叉连接还是应该创建一个新表'匹配'?

    哪一个更好?

    任何其他更好的解决方案将不胜感激!

1 个答案:

答案 0 :(得分:2)

我认为在这种情况下你最好存储所有匹配。正如您所知,匹配的数量是行数的二次方。根据您的用例,似乎最好保留一个包含每个用户所有看到的对的表,并在您查询该用户时将其排除。与整个组合空间相比,这可能相当稀疏。除非您需要在管理员批准时存储所有组合的数据,否则没有理由在那时生成它们。