组织MySQL表结构以便有效地索引对

时间:2009-07-31 10:47:22

标签: mysql optimization

目前有一个'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                     |
+----+-------------+-------+-------+---------------+------+---------+------+-------+---------------------------------+

这种类型的东西是否有更好的查询和/或数据结构?

2 个答案:

答案 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的索引)