Организация структуры таблиц MySQL для эффективной индексации пар - PullRequest
1 голос
/ 31 июля 2009

В настоящее время есть таблица '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 ]

1 голос
/ 31 июля 2009

Вам нужно создать два индекса на 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
0 голосов
/ 31 июля 2009

Если у вас есть индекс на (id1, id2), вы также должны иметь индекс на id2, для тех случаев, когда вы сравниваете с id2 отдельно. (вы получаете индекс по id1 бесплатно как часть индекса (id1, id2))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...