optimización de rendimiento de las consultas de las limitaciones optimizador de consultas y sugerencias

MySQL bucle anidado universal para cada consulta no son óptimas. Sin embargo, MySQL optimizador de consultas de sólo una pequeña parte de la consulta no se aplica a, y que a menudo obtener MySQL consulta haciendo puede reescribir la realización eficiente del trabajo.

1 asociados sub-consulta
subconsultas MySQL para lograr muy mala. Sub consulta en las peores condiciones para una clase contenidos en la consulta (). Debido a que MySQL tiene una estrategia especial de optimización en () en la lista de opciones, tienden a pensar en MySQL, primero realizará rendimientos sub-consulta todos los valores de la cláusula () en la consulta. En general, en () Lista de consulta rápida, por lo que considera que la llevaría a cabo sql

seleccionar * de tast_user donde id en ( seleccione ID de usuario en el nombre como ' Rey%');
pensamos que esto se resolvería a la siguiente sql formar
seleccionar * de tast_user en donde id ( 1,2,3,4,5);
en realidad se resuelve MySQL
SELECT * desde tast_user dONDE EXISTE
(SELECT ID de usuario desde donde nombre como 'rey%' y tast_user.id la user.id =);
la compresión de la tabla MySQL estará relacionada con la consulta sub-exterior, de modo que pueda encontrar de manera más eficiente la línea de datos.

Esta vez, debido a la sub-consulta utiliza un campo ID de la tabla externa, de manera sub-consulta no se puede ejecutar en primer lugar. Puede ser visto a través de explin, MySQL primera opción para la tabla tast_user escaneo completo de tabla, y luego uno por uno para realizar consultas sobre la base de Identificación del niño regresó. Si la capa externa es una mesa grande, el rendimiento de esta consulta será muy malo. Por supuesto, podemos optimizar la mesa de escribir:

seleccionar tast_user. * desde tast_user combinación interna de usuario utilizando (tast_user.id) donde user.name como ' % King'
Otra manera es optimizar el uso GROUP_CONCAT construido en una lista separada por comas (). Esto a veces se asocia con el uso de reescritura más rápido que el anterior. Debido al uso de () más sub-consultas, el rendimiento suele ser muy mala. Por lo general se recomienda el uso exists () equivalente consulta reescrita para conseguir una mayor eficiencia.

Cómo escribir mejor en la sub-consulta no se introduce, porque ahora requiere básicamente dividida en consultas de una sola mesa, e interesada, entonces usted puede ir sobre la siguiente.

2 restricción de la Unión
pueden, las limitaciones de MySQL pueden no ser derivados de la capa interior, lo que hace posible limitar la parte de las condiciones originales de regreso resultados no se pueden aplicar a la optimización de la consulta interna.

Si se desea la cláusula de unión respectivo se puede tomar de acuerdo con el límite conjunto de resultados parcial solamente, o para ser capaz de combinar el conjunto de resultados ordenada, entonces es necesario el uso de estas cláusulas son cada cláusula en la unión. Por ejemplo, queremos unir los dos resultados sub-consulta, y luego tomar la 20 antes, así MySQL será de dos tablas se almacenan en una tabla temporal, a continuación, quitar las primeras 20 filas.

(SELECT nombre, apellido del actor Ordenar por apellidos) Todos Unión
(SELECT nombre, apellido del pedido del cliente por apellidos) 20 es límite,
la grabación de este actor podría consultar la tabla de clientes y todos sacado en una tabla temporal y luego a 20 de la primera, respectivamente, mediante la adición de dos sub-consultas en un límite 20 para reducir los datos en la tabla temporal.

Ahora bien, en el medio de la tabla temporal contendrá sólo 40 registros, por consideraciones distintas de rendimiento, también hay necesidad de prestar atención a una sola cosa: el fin de recuperar datos de la tabla temporal no es seguro, por lo que si usted desea conseguir el orden correcto, también es necesario añadir ordenado por el funcionamiento de un mundial

tercer índice de optimización combinada
secciones anteriores ya se ha mencionado, el acceso de MySQL a una sola índices de tabla a una pluralidad de filtrado combinado y necesidad cruz para encontrar maneras de localizar una fila.

4 transferencia equivalente
algún momento, la transferencia equivalente traerá un poco de consumo adicional inesperado. Por ejemplo, hay una lista muy grande en (), y MySQL optimizador encuentra donde / o utilizando la cláusula, una columna estará asociado con esta lista de valores y una mesa.

El optimizador estará en () listas se asignan a cada aplicación en la tabla asociada. Típicamente, cada mesa como los nuevos criterios de filtro, el optimizador puede más divertido filtrada desde el motor de almacenamiento de grabación. Pero si la lista es muy grande, que dará lugar a la optimización y ejecución se ralentizará.

5 ejecución paralela
MySQL no puede tomar ventaja de características multi-núcleo de ejecución de consultas en paralelo. Muchas otras bases de datos relacionales Eng capaz de proporcionar esta característica, pero MySQL no puede hacer. Particularmente indicado aquí es para recordarle que no gastar tiempo tratando de encontrar una manera de ejecutar una consulta en paralelo.

6 asociación Hash
en 20.113 años de MySQL no lleva a cabo la asociación de hash, son todos asociación bucles anidados MySQL asociada. Sin embargo, puede conducir a la curva de la realización de hash asociada Si está utilizando el motor de la memoria, el índice es un índice hash, por lo que cuando la asociación es también similar al de hash asociada a través del establecimiento de un índice hash. Además MariaDB se ha logrado asociación hash.

7 exploración de índice suelta
debido a razones históricas, MySQL no admite la exploración de índice suelta, de acuerdo con el índice no será capaz de escanear una manera discontinua. En general, las necesidades de escaneo de índice MySQL para concentrarse y definen un punto de partida, incluso si los datos sólo necesitan este índice es raramente pocos, MySQL todavía tiene que escanear el segmento de índice en cada entrada.

Ejemplo: índice existente (a, B)

SELECT * donde a partir de la Tabla 2 y B entre 3;.

Como índice de campo de verificación es una, pero sólo se especifica en el campo de consulta b, MySQL no puede utilizar este índice, de modo que sólo por el total de mesa de exploración para encontrar las filas coincidentes. ,

MySQL escaneo completo de tabla:



comprender la estructura de la debilidad del índice, también puede ser difícil encontrar una manera más rápida para ejecutar la consulta anterior. almacenamiento Incapacidad estructura de índice motor no está en una API hace que sea posible escanear una gama de la columna B en la primera fila correspondiente al valor, y luego saltar a una columna diferente de la segunda gama de valores correspondientes a la exploración de la columna b



en este momento no hay necesidad de utilizar el donde el filtro cláusula, porque un recorrido de índice suelta ha superado todos los registros no deseados.

El anterior es un ejemplo sencillo de la exploración de índice suelta de procesamiento, añadir un índice adecuado, por supuesto, la consulta anterior puede ser optimizado. Sin embargo, para algunas escenas, el aumento del índice es inútil, por ejemplo, para las condiciones de alcance Solitude primera grieta, soledad fracción de segundo es construir el equivalente enviar consultas mediante la adición de índices no puede resolver el problema.

Después MySQL5.6, algunas restricciones en el recorrido de índice suelta asustaría indexado por condición de rama se resuelve.

8 valores máximos y mínimos optimizados
para MIN () y MAX () consulta, MySQL optimización hacen no es bueno, por ejemplo:

min SELECT (la actor_id) del Actor DONDE FIRST_NAME = 'Wang'
Debido a que en el campo nombre apellido y ningún índice, por lo MySQL llevará a cabo un escaneo completo de tabla. Si MySQL es capaz de escanear una clave principal, a continuación, en teoría, cuando MySQL lee el primer registro que cumpla las condiciones también, es lo mínimo que necesitamos, ya que la clave principal es estrictamente de acuerdo con el tamaño del hermano del campo de clasificación actor_id. Pero MySSQL entonces sólo hacer escaneo completo de tabla, se puede verificar a través de una mesa llena de estado del contador espectáculo de exploración de este. Una solución de optimización de condado es para eliminar la función min (), a continuación, utilizar el límite de 1 consulta.

Esta estrategia permite que MySQL escanee el número de registros lo menos posible. Este ejemplo nos que a veces con el fin de lograr un mayor rendimiento, lo que tiene que renunciar a algunos principios dice.

9 consultas y actualizaciones en la misma tabla
de MySQL no permite la misma mesa para consulta y actualización al mismo tiempo. Esto no es optimizador límites, si claro cómo MySQL se ejecuta la consulta, se puede evitar esta situación. Ejemplo:

Actualizar tabla SET CNT = (SELECT COUNT (*) como TB de la tabla donde tb.type = table.type);
el sql Aunque un único estándar no se puede realizar, se pueden pasar por alto las limitaciones anteriores mediante el uso de un formulario de tabla generada, MySQL porque sólo se pondrá esta tabla como una tabla temporal de tratar.

Interior del Únete a la Actualización de tabla
(SELECT del tipo, COUNT (*) AS cnt de la tabla por grupo del tipo) como un uso de la tuberculosis (del tipo)
del SET table.cnt = tb.cnt;
de hecho se llevó a cabo dos consultas: una consulta sub instrucción de selección, la otra es la actualización relacionada con la NRL, la tabla sólo cuando se asocia con una tabla temporal. Sub-consulta se completa antes de que la instrucción de actualización abre la tabla, se ejecutará correctamente.

Consejo 10 optimizador de consultas (pista)
Si el plan elegido por el optimizador no está satisfecho, puede utilizar el optimizador proporciona varios consejos (Pista) para controlar el plan de implementación final. Los siguientes son algunos consejos comunes, y dada simplemente cuándo usar las puntas. Mediante la adición de una pronta respuesta en la consulta, se puede controlar el plan de ejecución de la consulta.

① HIGH_PRIORITY y LOW_PRIORITY

este mensaje le dice a MySQL, cuando múltiples accesos simultáneos a una lista de declaraciones, que las declaraciones de prioridad relativamente más alta prioridad, que las declaraciones es relativamente baja.

HIGH_PRIORITY tiempo para la instrucción de selección, MySQL reprogramará esta instrucción de selección a todas las tablas están bloqueadas por lo que la sentencia antes de que los cambios en los datos. MySQL está colocado de hecho en la parte delantera de la tabla de cola, en lugar de esperar en una secuencia convencional. HIGH_PRIORITY también se puede utilizar para insertar el comunicado, el efecto es simplemente los efectos de escuelas deportivas mundiales establecidas LOW_PRIORITY el comunicado.

LOW_PRIORITY el contrario, hará que la declaración ha estado en un estado de espera, siempre y cuando se tiene acceso a la misma mesa en la cola, que tendrá que esperar en la cola. Puede ser utilizado en las declaraciones CRUD.

Estos dos consejos sobre el uso de la tabla únicamente se bloquea el motor de almacenamiento eficaz, InnoDB o no puede ser utilizado en otros motores tienen los mecanismos de control de concurrencia y de grano fino. En el MyISAM debe utilizarse con precaución, ya que estos dos consejos le conducen a inserciones concurrentes están desactivadas, puede degradar seriamente el rendimiento.

HIGH_PRIORITY LOW_PRIORITY y de hecho simplemente una orden de la cola para controlar el acceso a una tablas de datos MySQL.

② RETRASADO

Este consejo es válido para insertar y reemplazar. MySSQL usará el prompt instrucción inmediatamente al cliente, y se inserta la línea en el búfer de datos, y luego escribe los datos en la tabla de lotes está inactivo. sistemas de registro que utilizan estos consejos son muy eficaces, u otros grandes cantidades de datos necesitan ser escritas pero el cliente no tiene que esperar a la finalización de un único estado aplicaciones de E / S. Este uso con algunas limitaciones. No todos los motores de almacenamiento de apoyo, y las causas inmediatas de la función LAST_INSERT_ID () no funciona.

③ STRAIGHT_JOIN

este consejo puede prevenirse después se puede prevenir la instrucción de selección de palabras clave de selección entre dos nombres de tabla asociada. La primera es hacer uso de todas las tablas de la consulta asociada con el orden en que aparecen en el comunicado. La segunda regla se asocia con una secuencia fija antes y después de las dos tablas.

Cuando MySQL no eligió el orden correcto de relevancia - o cuando piden demasiado debido a las posibles causas MySQL no puede evaluar la totalidad de la secuencia asociada, STRAIGHT_JOIN será útil en MySQL podría emitir una gran cantidad de tiempo en las estadísticas estatales, además de esta clavija le reducen en gran medida el espacio de búsqueda optimizador

④ SQL_SMALLRESULT y SQL_BIG_RESULT

este mensaje sólo es válida para dos sentencias de selección. Ellos dicen que el optimizador de consultas o por grupo distinto de cómo utilizar tablas temporales y clasificación. SQL_SMALL_RESULT decir al optimizador que el resultado es muy pequeña manifestación, el conjunto de resultados se puede colocar en la memoria temporal en la tabla de índices para evitar la operación de clasificación. Si SQL_BIG_RESULT, le dirá al optimizador que el conjunto de resultados puede ser muy grande, se recomienda utilizar una tabla temporal para realizar operaciones de clasificación de discos.

⑤ SQL_BUFFER_RESULT

Esta sugerencia le dice al optimizador a los resultados de la consulta en una tabla temporal, a continuación, desbloquear rápidamente las tablas tanto como sea posible. Esto es consecuencia de la caché del cliente antes mencionados diferente. Cuando no se puede utilizar la caché del cliente, utilizando la memoria caché del lado del servidor suele ser muy eficaz. Los beneficios sin consumir demasiada memoria en el cliente, sino también para desbloquear las mesas tan pronto como sea posible. El costo del servidor requerirá más memoria.

⑥ SQL_CACHE y SQL_NO_CACHE

si este conjunto de resultados MySQL prompt hace que se deben colocar en la caché de consultas.

⑦ SQL_CALC_FOUND_ROWS

hermano Yan, esto no es un optimizador pistas. No dice nada sobre el plan de ejecución del optimizador. Esto hará que los rendimientos de MySQL el conjunto de resultados contiene más información. MySQL Query además el símbolo del calculará el número total de conjuntos de resultados después de esta cláusula para limitar la consulta a ser devuelto, y devolver los valores límite de conjunto de resultados realmente necesarias. Este valor puede ser obtenido por un found_row función (). Precaución, explicaría más tarde por qué.

⑧ DE ACTUALIZACIÓN Y BLOQUEO EN MODO DE ACCIÓN

esto no es cierto sugerencias del optimizador. Esto llevó a los dos principales mecanismos de control de cierre de la instrucción de selección, pero sólo es eficaz para lograr el motor de almacenamiento bloqueo de filas. Utilice los consejos coincidirá con las filas de bloqueo consulta. Para insertar / instrucción de selección no es necesario porque las dos puntas de estos registros por defecto en el 5.0 además de un bloqueo de lectura.

La única es una función de apoyo a estos dos motores consejos InnoDB, puede desactivar el comportamiento predeterminado. También hay que tener en cuenta que algunos de estos consejos no funcionará correctamente optimizado, por ejemplo, un índice que cubre la exploración. InnoDB no es exclusivo para bloquear en una fila sin tener acceso a la clave principal, la información de versión se almacena como filas de la clave primaria.

Si estos dos consejos a menudo se abusa, es fácil mañana contención de bloqueo del servidor.

⑨ utilizar el índice, IGNORE INDEX, y FORCE INDEX

estos consejos le dirá al optimizador para el uso o no uso de los índices de registro de consulta.

Añadido algunos parámetros en la versión 5.0 para controlar el comportamiento optimizador:

① optimizer_search_depth

Este parámetro controla los límites del optimizador del plan de aplicación exhaustiva. Si la consulta es mucho tiempo en las estadísticas estatales, se puede considerar la reducción de este parámetro.

② optimizer_prune_level

Este parámetro está activado por defecto, lo que hace que el optimizador decidirá si se debe omitir algunos de los plan de implementación basado en el número de líneas que deben analizarse.

③optimizer_switch

Esta variable contiene una serie de on / off características bandera optimizador.

Se utiliza para controlar el optimizador puede tomar algunos atajos cuando los primeros dos parámetros. Estos accesos directos pueden hacer que el optimizador cuando se trata de unas sentencias SQL muy complejas pueden ser más eficientes, pero también pueden permitir que el optimizador para pasar por alto algunos plan de ejecución verdaderamente óptima, así que la precaución.

Modificar optimizador consejos puede hacer la actualización después de la nueva versión de la estrategia de optimización de MySQL falla, hay que tener cuidado
---------------------
Autor: yongqi_wang
Fuente: RDCC
original: https : //blog.csdn.net/yongqi_wang/article/details/86527819
responsabilidad: Este artículo es un artículo original blogger, reproduce, por favor adjuntar enlace Bowen!
Publicados 966 artículos originales · ganado elogios 11 · Vistas a 30000 +

Supongo que te gusta

Origin blog.csdn.net/xiaoyaGrace/article/details/105270571
Recomendado
Clasificación