MySQL consulta SELECT * desde un id donde en (seleccione ID de b) ¿Cómo mejorar la eficiencia?

Para este plan de ejecución de instrucciones SQL no es realmente su primer cheque a cabo todos los b tabla de ID, y después se compara con el identificador de una mesa.
MySQL existe en la sub-consulta en sub-consultas asociado, por lo que es en realidad equivalente a esta sentencia SQL: SELECT * FROM a en la que existe ( seleccionar * desde donde b = b.id a.id);

Principio existe realiza subconsulta correlacionada es: un registro por ciclo tomado b un cuadro comparativo de la mesa, que las condiciones son relativamente a.id = b.id ver un ID de tabla de cada registro existe en la tabla b. , si hay una línea de retorno de la mesa de este registro.

Lo que existe inconvenientes investigación?
De existe la puesta en práctica del principio, una mesa (aspecto) no puede utilizar el índice, usted debe ser un escaneo completo de tabla, ya que los datos es conseguir una mesa en mesa para comprobar b. Y tiene que utilizar una tabla de datos a la tabla de verificación b (el exterior en la tabla), el orden fijo está muerto.

Cómo optimizar?
Para construir el índice. Sin embargo, el análisis anterior, el índice sólo puede construirse b campo id construida en la mesa, no en la identificación de una mesa, el uso de MySQL no está encendida.

Tal lo suficientemente optimizada? Algunos peor.
Debido a que existe consulta plan de ejecución sólo puede contener una tabla de datos a la tabla b cheque (el exterior al interior de la tabla), aunque la eficiencia de la consulta se puede mejorar en el campo ID de índice de la construcción b tabla.
Pero no se enciende, b sosteniendo tabla de datos para comprobar una tabla, existe consulta para subconsultas se fija muertos.

¿Por qué hay que acudir?
Porque en primer lugar, es cierto que, a su vez el resultado es el mismo. Esto a su vez conduce a una pregunta más detallada: cuando el campo ID en ambas tablas ambas construidas en el índice, al final es una alta eficiencia b tabla de comprobación de tabla o mesa b comprobar la eficacia de una mesa alta?

Cómo optimizar aún más?
El interior modificado consulta de combinación unirse a consulta: SELECT * FROM una combinación interna B en a.id = b.id; ( pero no son suficientes, y luego mirar hacia abajo)

¿Por qué no unirse a izquierda y derecha unirse?
Esta vez conectado en serie entre la mesa en vivo es fijo,

Por ejemplo, la izquierda es la conexión debe comprobar primero el escaneo completo de tabla tabla de la izquierda, y luego una a una a otra tabla a la consulta, las conexiones adecuadas empatía. Aún así no es la mejor opción.

¿Por qué utilizar combinación interna en él?
combinación interna de las dos tablas, tales como: una unión interna b, pero la implementación real de la orden no es un centavo que ver con la redacción de la orden, la ejecución final también puede conectarse b a, el orden no es fijo muertos. Si las condiciones en el campo indexado, el índice también se puede utilizar en.

Entonces, ¿cómo podemos saber qué tipo de ayb orden superior de eficiencia en la ejecución?
R: Usted no sabe, no sé. ¿Quién sabe? MySQL saber. Juzgue por usted mismo mysql (optimizador de consultas). Se unen a las órdenes y situaciones específicas utilizando la tabla de índices, evaluación de costos MySQL Query Optimizer se hará en cada caso, la elección final como el mejor del plan de ejecución.

Conexión de la combinación interna, mysql en su propia evaluación de la utilización eficiente de una tabla de la tabla de verificación o de alta b b una tabla de búsqueda tabla, si ambas tablas se construyen en el caso índice, MySQL también evaluar el campo de condición utiliza una tabla tabla de índice de alta eficiencia o b.

Y tenemos que hacer es: los dos campos son condición conectada de las dos tablas se han establecido en cada índice, y luego explicarlo para ver el plan de ejecución, ver mysql en el uso final de los cuales el índice, y finalmente el campo sin el uso de una tabla de índices índice para eliminar la línea.

 

problema muy extendido:

Parece que no podemos decir con eficiencia combinación interna sería sin duda en barra fija. Acabo de hacer una prueba, aquí están mis dos sentencias SQL:
el * SELECT desde elanw_client en el DONDE CUser (el nombre SELECT desde userinf)
el * SELECT desde elanw_client Un interior sobre el Ingreso a.cUser userinf b = b.name 
primera sql cuando se utiliza para 5.4s, el segundo con el sql Shique a 8.7s

Respuesta:

No quiere decir que se unen interior es más eficiente que en, su estado de cuenta en esta reescritura semi unen, y semi combinación y combinación interna en todos los casos los resultados no son equivalentes, semi unen medios que mientras existe la fila de la tabla derecha vuelve el ajuste de datos, combinación interna tendrán una fila de la tabla a la izquierda de cada partido de la tabla de la derecha para cumplir con todos los datos, si no hay un índice en la clave de combinación, entonces los semi unirse a está en rápido normal, volver a escribir lo que le sirve a combinación interna? Debido a que la combinación interna alrededor de la mesa se pueden cambiar, el optimizador puede elegir una información estadística óptima mediante la conexión de la orden, pero el orden de semi unirse a la conexión es fija, el optimizador no puede optar por unirse orden, si usted acaba de escribir consultas la izquierda tabla de datos grandes, y la mesa es pequeña, se trata de una orden de conexión mala, el optimizador no puede ser cambiado, semi unen pueden ser reescritos para precondición la unión interna es una clave principal o índice único vinculación

 

problema casi fuentes de referencia conocidos: https://www.zhihu.com/question/20699147

Publicado 80 artículos originales · ganado elogios 96 · vistas 360 000 +

Supongo que te gusta

Origin blog.csdn.net/Alen_xiaoxin/article/details/104773638
Recomendado
Clasificación