MySQL - оптимизация выбора между двумя связанными таблицами - PullRequest
0 голосов
/ 16 марта 2010

У меня есть две таблицы MySQL, состояния и транс:

состояний (200 000 записей) выглядит следующим образом:

id (INT) - also the primary key
energy (DOUBLE)
[other stuff]

trans (14 000 000 записей) выглядит так:

i (INT) - a foreign key referencing states.id
j (INT) - a foreign key referencing states.id
A (DOUBLE)

Я хотел бы найти все записи в trans с trans.A> 30. (скажем), а затем вернуть записи энергии из (уникальных) состояний, на которые ссылается каждая соответствующая запись. Я делаю это с двумя промежуточными таблицами:

CREATE TABLE ij SELECT i,j FROM trans WHERE A>30.;
CREATE TABLE temp SELECT DISTINCT i FROM ij UNION SELECT DISTINCT j FROM ij;
SELECT energy from states,temp WHERE id=temp.i;

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

CREATE TABLE temp SELECT DISTINCT i FROM trans WHERE A>30. UNION SELECT DISTINCT j FROM trans WHERE A>30.;

это заняло больше времени (предположительно, потому что пришлось дважды искать большую таблицу преобразования. Я новичок в MySQL и, похоже, не могу найти эквивалентную проблему и ответить там на веб-страницах. Большое спасибо, Christian

Ответы [ 2 ]

0 голосов
/ 20 марта 2010

ОК ... с небольшой помощью Axarydax и других я использую (по сути, эквивалентную) команду:

SELECT energy FROM states,
(SELECT i FROM trans where A>30. UNION SELECT j i FROM trans WHERE A>30.) temp
WHERE states.id=temp.i;

, который работает достаточно быстро, если у меня есть индекс для i, j и A.

0 голосов
/ 16 марта 2010

это должно сработать, я тестировал его в SQL Server 2008, так что, надеюсь, он работает и в MySQL.

select energy from states
where id in
(
    select distinct i from trans where a > 30
    union
    select distinct j from trans where a > 30   
)
...