2009-11-08 8 views
7

me di cuenta de algo extraño durante la ejecución de un grupo selecto de 2 tablas:MySQL Query Seleccione con sub-select lleva demasiado tiempo

SELECT * FROM table_1 WHERE id IN (
    SELECT id_element FROM table_2 WHERE column_2=3103); 

Esta consulta se llevó aproximativamente 242 segundos.

Pero cuando ejecuta la subconsulta

SELECT id_element FROM table_2 WHERE column_2=3103 

tardó menos de 0.002s (y dio 2 filas).
Entonces, cuando lo hice

SELECT * FROM table_1 WHERE id IN (/* prev.result */) 

que era la misma: 0.002s.

Me preguntaba por qué MySQL está haciendo la primera consulta de esa manera, tomando mucho más tiempo que las últimas 2 consultas por separado. ¿Es una solución óptima para seleccionar algo basado en los resultados de una subconsulta?

Otros detalles: table_1 tiene aprox. 9000 filas, y table_2 tiene 90000 filas.

Después de que agregué un índice en column_2 desde table_2, la primera consulta tomó 0.15s.

+0

¿cuántos resultados da la selección del interior? – Dani

+0

¿Podría publicar el resultado de ejecutar 'EXPLAIN SELECT * FROM table_1 WHERE id IN (SELECCIONAR id_element FROM table_2 WHERE column_2 = 3103)'. Esto mostrará qué plan de consulta e índices está usando MySQL. –

+0

@Dani la publicación indica que la consulta interna devuelve 2 filas. –

Respuesta

7

Quizás el analizador de consultas evalúe la subconsulta para cada fila.

Trate de reemplazar la sub consulta con un INNER JOIN, y ver si mejora el rendimiento:

SELECT  * 
FROM  table_1 t1 
INNER JOIN table_2 t2 
ON   t1.id = t2.id_element 
      AND t2.column_2 = 3103 
+0

Esto funciona bien; ~ 0.2s –

2

Esto es un error conocido en MySQL antes VER 6.

trabajo en torno a que he encontrado es:

SELECT * FROM table_1 DONDE EN id ( id_element SELECT FROM (SELECT id_element DE table_2 DONDE Columna_2 = 3,103) como q)

+1

¿Puedes agregar un enlace a los detalles del error? – aviv

+0

Esta solución redujo el tiempo libre en mi consulta particular (50 segundos hasta 10 segundos, pero las dos consultas separadas aún ganan en un .7sec combinado – scum

0

Tengo el mismo problema. Agregué un ÍNDICE para las tablas (supongo que ya lo hizo) y utilicé la directiva USE INDEX. En su caso, debe verse así:

SELECT * FROM table_1 USE INDEX(id) 
WHERE id IN (SELECT id_element FROM table_2 WHERE column_2=3103); 

Para mí, todo fue mejor.

+0

¿No es cierto que su campo de identificación es autoincrementado? MySQL debe saber usarlo sin especificar eso. –

Cuestiones relacionadas