как оптимизировать подзапрос MySQL

0

У меня есть следующий запрос, из которого я получаю ожидаемые результаты, проблема в том, что для возврата данных требуется много времени, я знаю, что медленность обусловлена следующей строкой

(select fecha_hora 
 from horas
 where horas.consulta_id = consultas.id
 AND fecha_hora >= NOW() 
 AND horas.estado = 0
 ORDER BY fecha_hora limit 0, 1) as hora 

Я не знаю, как это решить.

Цель состоит в том, чтобы получить дату и время, наиболее близкие к фактическому дню, доступному для врача (есть врачи, у которых нет доступности)

select 'medicos'.'id' as 'med_id'
, 'medicos'.'estado' as 'med_estado'
, 'medicos'.'descripcion'
, 'clinicas'.'nombre' as 'cli_nombre'
, 'clinicas'.'direccion' as 'cli_direccion'
, 'regiones'.'nombre' as 'region'
, 'comunas'.'nombre' as 'comuna'
, (select fecha_hora 
   from horas 
   where horas.consulta_id = consultas.id 
   AND fecha_hora >= NOW() 
   AND horas.estado = 0 
   ORDER BY fecha_hora 
   limit 0, 1) as hora
from 'consultas' 
inner join 'consulta_especialidad' 
 on 'consulta_especialidad'.'consulta_id' = 'consultas'.'id' 
inner join 'especialidades' 
  on 'especialidades'.'id' = 'consulta_especialidad'.'especialidad_id' 
inner join 'medicos' 
  on 'medicos'.'id' = 'consultas'.'medico_id' 
inner join 'clinicas' 
  on 'clinicas'.'id' = 'consultas'.'clinica_id' 
inner join 'regiones' 
  on 'regiones'.'id' = 'clinicas'.'region_id' 
inner join 'comunas' on 'comunas'.'id' = 'clinicas'.'comuna_id' 
where 'medicos'.'estado' != 5 
and 'clinicas'.'region_id' = 15 
and 'especialidades'.'id' = 116 
group by 'medicos'.'id' 
order by 'medicos'.'estado' desc
 , -'hora' desc, 'medicos'.'nombres' asc
 , 'medicos'.'apellidos' asc
  • 0
    Это зависимый или коррелированный запрос (подзапрос зависит от значения из внешнего запроса), поэтому он должен выполняться снова и снова для каждой строки во внешнем запросе. В идеале вы можете переписать его как независимый запрос или производную таблицу. См. Dev.mysql.com/doc/refman/5.7/en/derived-tables.html для некоторых примеров.
  • 0
    Я предлагаю вам начать с чтения некоторых из многих д + а здесь по оптимизации запросов, отмечая , какие вопросы upvoted, информацию , поступающую в вопросе и сравнивая , что с теми , которые downvoted и закрыты. Вы также должны прочитать FAQ и руководство о том, как задать вопрос. Затем попробуйте снова спросить, применяя то, что вы узнали.
Теги:
subquery

1 ответ

0

Не ответ. Слишком долго для комментария...

FWIW, мне это легче читать...

SELECT m.id med_id
     , m.estado med_estado
     , m.nombre_completo med_nombre_completo
     , m.seguridad med_seguridad
     , m.foto_perfil med_foto_perfil
     , m.genero med_genero
     , m.descripcion
     , l.nombre cli_nombre
     , l.direccion cli_direccion
     , l.id cli_id
     , l.telefono cli_telefono
     , l.link_agenda cli_link_agenda
     , r.nombre region
     , c.nombre comuna
     , (SELECT fecha_hora 
          FROM horas h
         WHERE h.consulta_id = k.id 
           AND fecha_hora >= NOW() 
           AND h.estado = 0 
         ORDER 
            BY fecha_hora 
         LIMIT 0,1
       ) hora
  FROM consultas k
  JOIN consulta_especialidad ke 
    ON ke.consulta_id = k.id 
  JOIN especialidades e
    ON e.id = ke.especialidad_id 
  JOIN medicos m 
    ON m.id = k.medico_id 
  JOIN clinicas l
    ON l.id = k.clinica_id 
  JOIN regiones r
    ON r.id = l.region_id 
  JOIN comunas c 
    ON c.id = l.comuna_id 
 WHERE m.estado != 5 
   AND l.region_id = 15 
   AND e.id = 116 
 GROUP 
    BY m.id 
 ORDER 
    BY m.estado DESC
     , -hora DESC -- ISN'T THIS THE SAME AS ASC???
     , m.nombres ASC
     , m.apellidos ASC

Замечание. У вас есть предложение GROUP BY, но нет агрегирующих функций. Это рецепт катастрофы.

Ещё вопросы

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