2

我正在建立一个照片内容网页。为了使所有的内容组合起来,我使用了交叉连接。假设我有以下简单表格:

桌子照片

id filename
------------
1   a.jpg
2   b.jpg
3   c.jpg
4   d.jpg
5   e.jpg

我可以从表中做出的组合数是 10,这些是

1,2
1,3
1,4
1,5
2,3
2,4
2,5
3,4
3,5
4,5

我通过使用以下交叉连接查询得到上述结果

    SELECT cp1.id,
           cp2.id 
      from photos as cp1 
cross join photos as cp2 
     where cp1.id < cp2.id

...并且我使用以下查询来显示用户没有看到的挑战。

    SELECT cp1.id,
           cp1.filename,
           cp2.id, 
           cp2.filename 
      from challenge_photos as cp1 
cross join challenge_photos as cp2 
     where cp1.id < cp2.id 
       and (cp1.id,cp2.id) not in ( (x1,x2), (x1,x2) ) 
       and cp1.id = something 
       and cp2.img_id != something

到目前为止,这些查询运行良好。phpmyadmin 的每个查询大约需要 0.0002 秒(来自 2300 行)。

假设我的表中有 2000 行。可能的组合数量是巨大的。当我的网站上有很多活跃用户时,我会遇到问题吗?

4

2 回答 2

3

我建议创建一个不同大小的测试数据库并测试查询以查看其性能。在 29k 行的表上进行类似的查询,我在 70k 行的表中得到 10-30ms 的查询和类似的数字,这似乎表明查询并不完全糟糕。查询似乎也被缓存了,这意味着如果您的表看到很少的写入和许多相同的查询,您将看到显着的好处。

您的示例查询中还有一个明显的不对称性:如果 cp1.id 很小,您将获得 100s/1000s 行,而如果它很大,您只会获得一些行。

这个 SO 问题是指交叉连接查询,其中 WHERE 子句的作用类似于内部连接。

于 2011-03-23T01:32:34.600 回答
0

2000,也许不是。有 20 万张照片,可能是的。

另一种方法是:

  1. 用 (cp1, cp2) 建立一个挑战表。
  2. 触发,当插入新照片时,根据您的规则在上表中添加新挑战
  3. 那么您的查询将是(INNER)加入 Challenge 和(两次) ChallengePhoto 表。

在表上有适当的索引,查询不会有任何问题。限制(查询带来的挑战数量)也将有助于提高性能。

于 2011-03-23T01:19:50.957 回答