estoy ejecutando una consulta que se parece a esteUtilizando un índice en MySQL JOIN con condición OR
SELECT parent.field, child.field
FROM parent
JOIN child ON (child.id = parent.id
OR child.id = parent.otherid)
Ésta es sin embargo muy lento (alrededor de 100 mil registros, y se une a otras tablas en la versión real), pero a pesar de haber intentado índices en
parent.id (PRIMARY),
parent.otherid,
child.id (PRIMARY),
and a composite index of parent.id and parent.otherid
No consigo que MySQL use ninguno de esos índices al hacer esta unión.
leí que MySQL puede utilizar solamente un índice por unirse, pero no puede encontrar en cualquier lugar si se puede utilizar un índice compuesto cuando un JOIN contiene una condición OR.
¿Alguien aquí sabe si es posible hacer referencia a esta consulta en un índice? Si es así, ¿cómo?
mi solución
(SO no me deja responder a mi propia pregunta a continuación atm)
Un montón de ajustes y se le ocurrió una solución bastante decente, que conserva la capacidad para unirse y agregar otras tablas
SELECT parent.field, child.field
FROM parent
JOIN (
SELECT parent.id as parentid,
# Prevents the need to union
IF(NOT ISNULL(parent.otherid) AND parent.otherid <> parent.id,
parent.otherid,
parent.id) as getdataforid
FROM parent
WHERE (condition)
) as foundrecords
ON foundrecords.parentid = parent.id
JOIN child ON child.id = parent.getdataforid
Para la velocidad requiere una condición dentro de la subconsulta para reducir el número de registros colocados en una tabla temporal, pero tengo toneladas de uniones adicionales en la consulta externa, algunos de unirse a los niños y otros para los padres (con algunos agregados) por lo que este funcionó mejor para mí.
En muchos casos, una unión será más rápida y efectiva, pero como estoy filtrando en mi padre, pero quiero datos adicionales de mi hijo (autorreferencias de padres), la unión me generó filas adicionales que no pude consolidar. Es posible encontrar el mismo resultado simplemente uniendo parent a sí mismo y aliasing una condición where en la consulta externa, pero este funciona muy bien para mí.
Gracias a Jirka para la UNION ALL de sugerencia, que es lo que me impulsó a llegar hasta aquí :)
corriste '' EXPLAIN SELECT ... en la consulta? –
sí, la explicación es lo que me permite saber que no está usando ningún índice para esta unión. –