Я не думаю, что ничего плохого в моем запросе, но не знаю, почему система становится очень медленной, когда я загружаю этот код в 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')
)
Заранее спасибо.
Добавьте эти индексы:
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, так как он должен работать лучше (избегайте устранения дубликатов, что может занять время).
Добавьте это к каждой таблице:
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
like
операторы? Использовать=
EXPLAIN
перед запросом и запустить его ... MySQL сам по себе может предоставить вам базовый отчет о производительности.