我有两个实体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>
这给我带来了非常糟糕的表现
答案 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)
(按此顺序),以便快速开展工作。
哪种查询更有效取决于您的数据分布。