Есть ли что-то более эффективное, чем объединение таблиц в MySQL? - PullRequest
1 голос
/ 13 ноября 2010

У меня есть таблица со структурой атрибут-значение-сущность. В качестве примера, я могу иметь разные страны. У меня могут быть следующие атрибуты: «расположен в», «имеет границу с», «прописной».

Тогда я хочу найти все те страны, которые «расположены в Азии» и «граничат с Россией». Простой способ сделать это - соединить таблицу с самим собой, используя сущности, - это столбец для объединения, а затем использовать where.

Однако, если у меня есть 20 строк, где Россия в столбце сущностей, то в объединенной таблице у меня будет 20 * 20 = 400 строк с Россией в качестве сущности. И это так для каждой страны. Итак, совместный стол будет огромным.

Не будет ли более эффективно использовать исходную таблицу для извлечения всех стран, расположенных в Азии, затем для извлечения всех стран, граничащих с Россией, и затем использовать те элементы, которые находятся в обоих наборах стран?

Ответы [ 2 ]

1 голос
/ 13 ноября 2010

Вы не должны иметь огромное количество записей, так что это должно работать

SELECT  a.entity,
    a.located_in,
    a.border
FROM    my_table a
WHERE   a.border in (SELECT b.entity FROM my_table b WHERE b.entity = 'RUSSIA' )
AND     a.located_in = 'ASIA'
1 голос
/ 13 ноября 2010

Вы путаете соединение с декартовым произведением.В соединении никогда не может быть больше строк, чем в фактических данных, единственное, что изменяется, это , которое элементов / строк берется.

Так что, если у вас есть 20 русских строк,таблица, полученная в результате объединения, не может содержать более 20 русских записей.

Операция, которую вы предлагаете использовать, - это именно то, что делает объединение.Просто убедитесь, что у вас есть соответствующие индексы, и пусть MySQL сделает все остальное.

...