我们有一个“用户”表,其中包含有关我们用户的信息。此表中的一个字段称为“查询”。我正在尝试选择具有相同查询的所有用户的用户 ID。所以我的输出应该是这样的:
user1_id user2_id common_query
43 2 "foo"
117 433 "bar"
1 119 "baz"
1 52 "qux"
不幸的是,我无法在一个小时内完成此查询(用户表非常大)。这是我当前的查询:
SELECT u1.id,
u2.id,
u1.query
FROM users u1
INNER JOIN users u2
ON u1.query = u2.query
AND u1.id <> u2.id
我的解释:
+----+-------------+-------+-------+----------------------+----------------------+---------+---------------------------------+----------+--------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+----------------------+----------------------+---------+---------------------------------+----------+--------------------------+
| 1 | SIMPLE | u1 | index | index_users_on_query | index_users_on_query | 768 | NULL | 10905267 | Using index |
| 1 | SIMPLE | u2 | ref | index_users_on_query | index_users_on_query | 768 | u1.query | 11 | Using where; Using index |
+----+-------------+-------+-------+----------------------+----------------------+---------+---------------------------------+----------+--------------------------+
正如您从解释中看到的,用户表在查询中被索引,并且该索引似乎正在我的 SELECT 中使用。我想知道为什么表 u2 上的“行”列的值为 11,而不是 1。我可以做些什么来加快这个查询的速度吗?我的 '<>' 在 join 中的比较是不好的做法吗?此外,id 字段是主键