MySQL Slow double join - PullRequest
       14

MySQL Slow double join

1 голос
/ 18 января 2012

У меня есть таблица ссылок с from_uid и to_uid (оба проиндексированы), и я хочу отфильтровать определенные идентификаторы.Итак, я делаю:

SELECT l.uid
  FROM Link l 
  JOIN filter_ids t1 ON l.from_uid = t1.id 
  JOIN filter_ids t2 ON l.to_uid   = t2.id

Теперь по какой-то причине это неожиданно медленно :( тогда как каждое отдельное соединение очень быстрое. Разве оно не может использовать индекс правильно?

EXPLAIN говорит мне:

id  select  table type  possible_keys   key      key_len ref  rows  Extra
1   SIMPLE  t1    index Null            PRIMARY  34      Null 12205 Using index
1   SIMPLE  l     ref   from_uid,to_uid from_uid 96      func 6     Using where
1   SIMPLE  t2    index Null            PRIMARY  34      Null 12205 Using where; Using index; Using join buffer

Ответы [ 2 ]

0 голосов
/ 18 января 2012

Объяснение говорит вам, что JOIN фактически начинается с таблицы t1. То есть вам нужно добавить новый индекс на Link (или лучше расширить текущий индекс from_uid):

(from_uid, to_uid, uid)

или, если uid - первичный ключ, просто:

(from_uid, to_uid)

UPD То, что вы описываете, странно. Вы можете попробовать запустить просто:

SELECT STRAIGHT_JOIN l.uid
FROM Link l 
JOIN filter_ids t1 ON l.from_uid = t1.id 
JOIN filter_ids t2 ON l.to_uid   = t2.id
0 голосов
/ 18 января 2012

Не знаю, поможет ли это, но попробуйте:

select l.uid
from Link l
where l.from_uid in (select id from filter_ids)
and l.to_uid in (select id from filter_ids)

Возможно, это улучшит работу с индексами.

...