¿Las tablas de asignación de SQL aceleran las consultas? ¿Cómo los usas?

Me gustaría saber cuál es el propósito de una tabla de mapeo y cómo acelera las consultas de MySQL. Estoy trabajando para acelerar una consulta lenta de MySQL y encontré este pregunta de desbordamiento de pila. Los comentarios sugieren que las tablas de mapeo no solo aceleran las consultas que unen ambas tablas, sino que son la forma adecuada de estructurar una base de datos.

Tengo una estructura de tablas que es muy similar, con una relación de uno a muchos. A medida que crece la tabla, el tiempo de ejecución de la consulta sigue aumentando hasta niveles inaceptables. Como no he podido encontrar mucho en la web para ayudar a resolver mi problema, pensé en probar stackoverflow, ya que ustedes nunca me han defraudado.

preguntado el 03 de mayo de 12 a las 21:05

Creo que no entendiste la respuesta con respecto al rendimiento. La respuesta tenía que ver con Not In Vs Not Exists, que se discute extensamente en Quassnoi artículo IN vs. NO EXISTE vs. LEFT JOIN / IS NULL: MySQL y no "tablas de mapeo" -

por lo tanto, una tabla de mapeo no afectaría mi tiempo de consulta en ese momento, eso no parecía tener mucho sentido para mí. -

Tampoco tendría mucho sentido para mí, a menos que haya algún golpe de rendimiento extraño que tenga que ver con el ancho de los valores en un índice. Te recomiendo que le eches un vistazo a la plan de ejecución de consultas y ver dónde está el cuello de botella. -

En última instancia, el problema fue más básico de lo que esperaba (no soy un experto en SQL). Aparentemente, usar una tabla a la que se hizo referencia anteriormente como una subconsulta en la cláusula where puede ser abismalmente lento. Resolví el problema creando una tabla temporal y usándola en su lugar. Si alguien puede ofrecer una explicación simple de cómo eso ayuda, votaré su comentario. -

Bueno, puedes probar y usar EXPLAIN EXTENDED para ver cuáles son las diferencias. -

2 Respuestas

Lo primero que debe responder es por qué la consulta se está ejecutando tan lentamente. Suponiendo que tiene la siguiente consulta

SELECT * FROM Customer WHERE CustomerID= 1

Está corriendo lento. Entonces, ¿cómo determinas por qué se está ejecutando lento? Escribe lo siguiente:

EXPLAIN ALL SELECT * FROM Customer WHERE CustomerID=1

Esto devolverá un conjunto de resultados que indica cómo MySQL llega a los datos. Aquí puede encontrar pistas sobre índices faltantes, etc., que pueden ayudar a optimizar sus consultas.

Consulte los siguientes enlaces para obtener más respuestas:

http://dev.mysql.com/doc/refman/5.0/en/explain.html

Optimización del índice de la tabla MySQL

Incluso si usó una tabla de mapeo y sus consultas e indexación no son óptimas, tendrá un rendimiento abismal.

contestado el 23 de mayo de 17 a las 12:05

Me gustaría saber cuál es el propósito de una tabla de mapeo

Se utiliza una tabla de mapeo para representar una relación de "muchos a muchos". Por ejemplo, en la pregunta que citó, hay dos entidades: libros y estudiantes. Un estudiante puede tomar prestados muchos libros; un libro puede ser prestado por muchos estudiantes.

La forma estándar de representar esto en el modelo relacional es a través de una "tabla de mapeo", que tendría claves externas para libros y estudiantes, junto con cualquier información relacionada con el préstamo, por ejemplo, fecha de inicio y finalización.

Una tabla de mapeo es de hecho una forma "adecuada" de modelar relaciones de muchos a muchos.

y cómo acelera las consultas de MySQL

No es así en la mayoría de los casos, aunque normalmente funciona mejor que otras formas de representar relaciones de "muchos a muchos". Si el rendimiento es su preocupación, la respuesta de @Namphibian está en el dinero como punto de partida.

contestado el 04 de mayo de 12 a las 10:05

Entonces, ¿una tabla de mapeo no es realmente útil en una relación de uno a muchos? Parece que leí mal o me engañó la pregunta a la que hice referencia. - JoBu1324

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.