Я пишу mysql-запрос с левым соединением, давая мне результат в 28 секунд, когда я удаляю и соглашусь с левым соединением, а затем он работает через одну секунду. Кто-нибудь скажет мне, в чем проблема в моем запросе и как он будет изменен?
select *
FROM regist_queue rq
left join appoint ap
on rq.token_number = ap.daily_ticket_no
and rq.LocationId = 15800
and ap.LocationId = 15800
and date(rq.QueueDate) = CURRENT_DATE()
and date(ap.dAppDate) = date(now())
left join patient pr
on ap.iPatID = pr.IPatID
left join gender ge
on pr.vGender = ge.iGenderID
where ifnull(ap.isDel,0) = 0
and ifnull(ap.is_referred,0) != 1
and (ap.LocationId = 15800 or rq.LocationId = 15800 )
order by rq.token_number asc;
Я также применял индексы по всем найденным параметрам и применял объединения. Объясните план запроса. План запросов MySql
Твоя цель для меня не совсем понятна. Для примера в join and rq.LocationId = 15800 and ap.LocationId = 15800
и в предложении where and (ap.LocationId = 15800 or rq.LocationId = 15800 )
что мое предложение должно иметь что-то вроде этого.
в левом объединении rq.LocationId = ap.LocationId
и в предложении ap.LocationId = 15800
трудно оценить производительность без реальных данных.
кажется, есть декартово соединение....
база на трех предикатах начинается с.........,
Я думаю, что выражение sql не основано на вашей реальной цели...
Использовать SQL with (nolock)
в sql-запросе
лайк:
select *
FROM regist_queue rq with (nolock)
left join appoint ap with (nolock)
on rq.token_number = ap.daily_ticket_no
and rq.LocationId = 15800
and ap.LocationId = 15800
and date(rq.QueueDate) = CURRENT_DATE()
and date(ap.dAppDate) = date(now())
left join patient pr with (nolock)
on ap.iPatID = pr.IPatID
left join gender ge with (nolock)
on pr.vGender = ge.iGenderID
where ifnull(ap.isDel,0) = 0
and ifnull(ap.is_referred,0) != 1
and (ap.LocationId = 15800 or rq.LocationId = 15800 )
order by rq.token_number asc;
Explain
команды было бы полезно.