MySql запрос выполняется слишком медленно?

0

Я пишу 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

  • 0
    Explain команды было бы полезно.
  • 0
    я обновил свой запрос с изображением плана запроса.
Теги:
mysql-workbench
mysqli
mysql-error-1064

3 ответа

0
Лучший ответ

Твоя цель для меня не совсем понятна. Для примера в 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

трудно оценить производительность без реальных данных.

  • 0
    Можете ли вы изменить весь запрос с тем, что вы предлагаете.
  • 0
    select * FROM regist_queue rq left join назначить ap для rq.token_number = ap.daily_ticket_no и rq.LocationId = ap.LocationId и date (rq.QueueDate) = CURRENT_DATE () и date (ap.dAppDate) = date (сейчас ()) оставьте присоединяющегося пациента pr на ap.iPatID = pr.IPatID оставьте присоединяющийся пол ge на pr.vGender = ge.iGenderID, где ifnull (ap.isDel, 0) = 0 и ifnull (ap.is_referred, 0)! = 1 и (ap .LocationId = 15800) порядок по rq.token_number asc;
Показать ещё 3 комментария
0

кажется, есть декартово соединение....

база на трех предикатах начинается с.........,

Я думаю, что выражение sql не основано на вашей реальной цели...

  • 0
    это ответ?
0

Использовать 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;
  • 0
    без блокировки дает мне синтаксическую ошибку. неверный синтаксис рядом с ожидаемым концом ввода.
  • 0
    я прочитал его и реализовал SET SESSION TRANSACTION LEVEL READ UNECOMITITED READ UNICOMITTED для mysql, но его выполнение заняло то же время, я обновил свой вопрос изображением плана запроса.

Ещё вопросы

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