是否有更有效的方法?我一直以为我缺少什么。谢谢
"['<div class=\"content\">rn gitar calmak icin kullanilan minik plastik garip nesne.rn </div>']"
我两次击中同一张桌子,我想知道我能否更快地获得相同的结果。
表结构:
SELECT DISTINCT eventId
FROM event_tags_map
WHERE tagId in (
SELECT tagId FROM event_tags_map WHERE eventId=114778
) ORDER BY RAND() LIMIT 5;
索引:
mysql> describe event_tags_map;
+---------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+------------------+------+-----+---------+-------+
| eventId | int(10) unsigned | NO | PRI | NULL | |
| tagId | int(10) unsigned | NO | PRI | NULL | |
+---------+------------------+------+-----+---------+-------+
答案 0 :(得分:1)
我看来您将需要两次或多次引用原始表。
我建议您不要使用IN
条件,该条件的伸缩性不是很好,并且具有各种反常的行为。
我的第一个选择是使用具有EXISTS
条件的相关子查询。这通常是检查是否存在 ...
SELECT DISTINCT eventId
FROM event_tags_map m
WHERE EXISTS (
SELECT 1 FROM event_tags_map m1 WHERE m1.eventId = 114778 AND m1.tagId = m.tagId
)
ORDER BY RAND() LIMIT 5;
另一种选择是使用自我INNER JOIN
:
SELECT DISTINCT eventId
FROM event_tags_map m
INNER JOIN event_tags_map m1 ON m1.eventId = 114778 AND m1.tagId = m.tagId
ORDER BY RAND() LIMIT 5;
两个解决方案都应该能够利用event_tags_map(eventId, tagId)
上的复合索引。