有没有比这更有效的方法?我一直在想我错过了什么。谢谢

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    |       |
+---------+------------------+------+-----+---------+-------+

索引:
mysql> show index from event_tags_map;
+----------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table          | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+----------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| event_tags_map |          0 | PRIMARY  |            1 | eventId     | A         |      302032 |     NULL | NULL   |      | BTREE      |         |               |
| event_tags_map |          0 | PRIMARY  |            2 | tagId       | A         |      604065 |     NULL | NULL   |      | BTREE      |         |               |
+----------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.02 sec)

最佳答案

我看你需要用这种或那种方式两次查阅原始表格。
我建议不要使用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;

另一种选择是使用self-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)上的复合索引。

09-11 09:46