MYSQL не может загрузить оператор OR для разных таблиц

0

Я не думаю, что ничего плохого в моем запросе, но не знаю, почему система становится очень медленной, когда я загружаю этот код в phpmyadmin. Любой совет, пожалуйста, помогите.

select
  *
from
  'table1'
left join
   'table2'
on
  table1.id = table2.id
where
(
   (table1.email = '[email protected]' and table1.mobile = '99999999')
 or
   (table2.email = '[email protected]' and table2.mobile = '99999999')
) 

Заранее спасибо.

  • 0
    Почему like операторы? Использовать =
  • 1
    Попробуйте вставить EXPLAIN перед запросом и запустить его ... MySQL сам по себе может предоставить вам базовый отчет о производительности.
Показать ещё 6 комментариев
Теги:
query-performance

2 ответа

0

Добавьте эти индексы:

ALTER TABLE 'table1' ADD INDEX 'table1_idx_id' ('id');
ALTER TABLE 'table2' ADD INDEX 'table2_idx_id' ('id');
ALTER TABLE 'table1' ADD INDEX 'table1_idx_email_mobile_id' ('email', 'mobile', 'id');
ALTER TABLE 'table2' ADD INDEX 'table2_idx_email_mobile_id' ('email', 'mobile', 'id');

И преобразованный запрос (исключая условие ИЛИ, которое не является индексируемым, используя UNION DISTINCT):

(SELECT 
    *
FROM
    'table1'
        LEFT JOIN
    'table2' ON table1.id = table2.id
WHERE
    ((table2.email = '[email protected]'
        AND table2.mobile = '99999999'))) UNION DISTINCT (SELECT 
    *
FROM
    'table1'
        LEFT JOIN
    'table2' ON table1.id = table2.id
WHERE
    ((table1.email = '[email protected]'
        AND table1.mobile = '99999999')))

PS, если нет возможности иметь дубликаты, используйте UNION ALL вместо UNION DISTINCT, так как он должен работать лучше (избегайте устранения дубликатов, что может занять время).

0

Добавьте это к каждой таблице:

INDEX(email, mobile)  -- in either order.

Если это не ускорит его, то также превратите OR в UNION:

SELECT *
     FROM ( ( SELECT id FROM table1 WHERE email = ... AND mobile = ... )
              UNION DISTINCT
            ( SELECT id FROM table2 WHERE email = ... AND mobile = ... )
          ) AS x
    JOIN table1 WHERE table1.id = x.id
    JOIN table2 WHERE table2.id = x.id

Ещё вопросы

Сообщество Overcoder
Наверх
Меню