索引SET字段

时间:2010-04-15 14:28:01

标签: mysql many-to-many indexing set

我有两个实体A和B.它们与多对多关系有关。实体A最多可以与100个B实体相关联。实体B最多可与10000个实体相关联。我需要快速选择30个实体,它们与指定的B实体有关系,按不同的属性进行过滤和排序。

这里我看到了理想的解决方案:我将所有关于A实体的信息,包括它们与B实体的关系放入单行(带有SET字段的特殊表),然后添加所有必要的索引。问题是您在使用SET字段查询时无法使用索引。我该怎么办?我可以用不同的东西替换数据库,如果这有帮助的话。

更新:对不起。看起来我忘了提一个重要的细节。我需要找到那些与B条目有关系的条目,id = 1,同时B条目id = 2。所以如果使用连接,我会有类似的东西:

  

SELECT a.id,count(*)as cnt FROM INNER JOIN ab ON a.id = ab.a_id WHERE ab.b_id IN(1,2)GROUP BY a.id ORDER BY NULL cnt = 2 < / p>

这给我带来了非常糟糕的表现

1 个答案:

答案 0 :(得分:1)

你为什么不这样做:

SELECT  *
FROM    a
WHERE   a.id IN
        (
        SELECT  ab.a
        FROM    b
        JOIN    ab
        ON      ab.b = b.id
        WHERE   b.id IN (1, 2, 3, 4)
        )

并在PRIMARY KEY上创建ab (b, a)

更新

使用此:

SELECT  *
FROM    a
WHERE   (
        SELECT  COUNT(*)
        FROM    ab
        WHERE   ab.a = a.id
                AND ab.b IN (1, 2, 3, 4)
        ) = 4
ORDER BY
        ...
LIMIT 30

或者这个:

SELECT  a.*
FROM    (
        SELECT  a
        FROM    ab
        WHERE   ab.b IN (1, 2, 3, 4)
        GROUP BY
                a
        HAVING  COUNT(*) = 4
        ) q
JOIN    a
ON      a.id = q.id
ORDER BY
        ...
LIMIT 30

您需要PRIMARY KEY ab (b, a)(按此顺序),以便快速开展工作。

哪种查询更有效取决于您的数据分布。