目前有一个'item'表和一个'pair'表。对表只包含两列,其中包含项表中的主键。
常见的查询是查找在最少数量的对中显示的项目数。
SELECT id,COUNT(*) AS count FROM item i LEFT JOIN pair p ON (i.id = p.id1 OR i.id = p.id2) GROUP BY id ORDER BY count,RAND() LIMIT 100
但查询是明智的表现。 id1上有一个索引,对上有id2。
+----+-------------+-------+-------+---------------+------+---------+------+-------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+------+---------+------+-------+---------------------------------+
| 1 | SIMPLE | item | ALL | NULL | NULL | NULL | NULL | 5644 | Using temporary; Using filesort |
| 1 | SIMPLE | pair | index | id1 | id1 | 8 | NULL | 18377 | Using index |
+----+-------------+-------+-------+---------------+------+---------+------+-------+---------------------------------+
这种类型的东西是否有更好的查询和/或数据结构?
答案 0 :(得分:1)
您需要在pair
上创建两个索引:
CREATE INDEX ix_pair_1 ON pair (id1)
CREATE INDEX ix_pair_2 ON pair (id2)
并将此查询重写为:
SELECT (
SELECT COUNT(*)
FROM pair
WHERE id1 = i.id
) +
(
SELECT COUNT(*)
FROM pair
WHERE id2 = i.id
) AS cnt
FROM item i
ORDER BY
cnt, RAND()
LIMIT 100
答案 1 :(得分:0)
如果你有一个索引(id1,id2)你也应该有id2的索引,对于那些你自己匹配id2的情况。 (作为(id1,id2)索引的一部分,你可以免费获得id1的索引)