Al igual que otros señalados, necesita los índices adecuados. Para esta consulta en particular, puede beneficiarse de índices como:
(Location, Date
) o (Date, Location
) (para la cláusula WHERE
) y (Title, Variables
) o (Variables, Title
) (para la condición join
, ON
cláusula)
Sería útil saber exactamente el tamaño (es decir, el tipo de datos) de la ubicación, fecha, título y columnas de variables, ya que un índice grande es más lento que uno pequeño.
Finalmente, solo un consejo: no usaría constructos de comparación sofisticados como usted. El
USING (Title, Variables)
es probablemente muy bien, pero sin duda comprobar si
(t1.Location, t1.Date) = ('Location1', 'Date1')
y
(t2.Location, t2.Forecast_date) = ('Location2', 'Date2')
están comportando como se esperaba. Así que sin duda correr EXPLAIN
en él, y comparar la salida con una comparación pasada de moda "regular", así:
t1.Location = 'Location1'
AND t1.Date = 'Date1'
AND t2.Location = 'Location2'
AND t2.Forecast_date = 'Date2'
Se podría argumentar que, lógicamente, es el mismo y no debería importar - usted Estaría bien. Pero, una vez más, el optimizador de MySQL no es muy inteligente, y siempre existe la posibilidad de errores, especialmente con características que no se usan mucho. Creo que esta es una característica. Así que al menos trataría de EXPLICAR y ver si estas notaciones alternativas se evalúan de la misma manera.
Pero lo BenoKrapo señaló, ¿no sería más fácil hacer algo como esto:
SELECT Title, Variables
FROM MyTABLE
WHERE Location = 'Location1' AND Date = 'Date1'
OR Location = 'Location2' AND Date = 'Date2'
GROUP BY Title, Variables
HAVING COUNT(*) >= 2
EDIT: He cambiado HAVING COUNT(*) = 2
a HAVING COUNT(*) >= 2
. Ver comentarios (gracias de nuevo, BenoKrapo)
EDIT: días después de la publicación de esta respuesta, me encontré con este post de la marca Callaghan, MySQL Arquitecto de Facebook: http://www.facebook.com/note.php?note_id=243134480932 En esencia, se describe cómo entregan similares-pero-diferentes comparaciones 'inteligentes' rendimiento abismal debido al error del optimizador de MySQL. Así que mi punto es que, tratando de desentenderse de tu sintaxis cuando sufres, es posible que hayas tocado un error.
para empezar, utilice los índices – Lukman
utilice "EXPLAIN" antes de su consulta para generar un plan de consulta que MySQL utilizará, que ayudará a la investigación de ayuda. – mjsabby