MySQL запрос игнорирует индекс при использовании LEFT JOIN с OR? - PullRequest
3 голосов
/ 05 августа 2011

У меня есть этот запрос:

SELECT f.uid, fi.status FROM friends f
LEFT JOIN friends_invitations fi ON f.fid = fi.fid
WHERE (f.uid = 2 OR fi.uid = 2)

Вышеприведенный запрос верен, однако с точки зрения производительности он сканирует все строки в таблице друзей и игнорирует индекс f.uid в предложении WHERE, несмотря на fidи uid являются индексами в ОБАХ таблицах.

По сути, я хочу, чтобы оптимальный подход был для поиска пользователя, который существует в таблице друзей или приглашений друзей, используя поле 'uid'.

Любые идеи / предложения

Ответы [ 3 ]

2 голосов
/ 05 августа 2011

как насчет:

SELECT f.uid, fi.status 
FROM friends f 
LEFT JOIN friends_invitations fi ON f.fid = fi.fid 
WHERE (f.uid = 2) 
UNION
SELECT f.uid, fi.status 
FROM friends f 
INNER JOIN friends_invitations fi ON f.fid = fi.fid 
WHERE fi.uid = 2

Комбинация или и левого соединения делает ваш запрос полным сканированием

0 голосов
/ 05 августа 2011
SELECT u.uuid, fi2.status FROM
( SELECT f.uid AS uuid FROM friends AS f WHERE f.uid = 2
  UNION
  SELECT fi.uid FROM friends_invitations AS fi WHERE fi.uid = 2 ) AS u
LEFT JOIN friends_invitations AS fi2 WHERE u.uuid = fi2.uid
0 голосов
/ 05 августа 2011

Используйте UNION:

SELECT f.uid FROM friends f WHERE f.uid = 2
UNION
SELECT f.uid FROM friends f
JOIN f.friends_invitations fi ON f.fid = fi.fid
WHERE fi.uid = 2
...