toda la red de la práctica más amplia optimización de rendimiento de MySQL, programador batalla frases esenciales! ! !

Una inscripción

Recientemente, la compañía proyecta para agregar nuevas características en la línea después de mucho tiempo encontrar una lista de algunas funciones de consulta. La razón es una nueva característica para utilizar la interfaz de la función de edad, y las interfaces de consulta SQL asociados con estas viejas tablas 5,6 y la escritura no ha sido estandarizada, lo que resulta en un fracaso del índice de MySQL en la ejecución de las sentencias SQL, un escaneo completo de tabla. Originalmente responsable de optimizar sus colegas algo que salir para ir a casa, optimizando así el problema de los datos consulta cae en manos del autor. El autor después de la información en línea Optimización del acceso SQL resuelto satisfactoriamente el problema, esto desde un punto de vista global, registrar y resumir las técnicas de optimización de consultas MySQL pertinentes.

En segundo lugar, las ideas de optimización

Los datos de consultas lentas, no significa que la instrucción SQL escrito en cuestión. En primer lugar, tenemos que encontrar la fuente del problema, "el medicamento correcto." Use un diagrama de flujo que muestra las ideas de optimización de MySQL:

toda la red de la práctica más amplia optimización de rendimiento de MySQL, programador batalla frases esenciales!  !  !

 

No hay más palabras pueden verse claramente en la figura, lo que resulta en datos lentos consultar una variedad de razones, tales como: la invalidación de caché, dentro de este período de tiempo debido a los altos potenciales de acceso simultáneo a un servidor MySQL se bloquee; sentencias SQL escritura problema; servidor MySQL parámetros del problema; limitaciones de la configuración de hardware de MySQL problemas de rendimiento del servicio.

En tercer lugar, ver el estado del servidor MySQL se está ejecutando valor

Si el número de solicitudes simultáneas del sistema no es muy alta, y la consulta es lento, este paso se puede omitir sentencias SQL directamente tuning paso.

Ejecutar el comando:

show status

Desde el retorno demasiados resultados, donde los resultados no se publican. Entre ellos, los resultados de vuelta, nos centramos en el valor de "Consultas", "Threadsconnected" y "Threadsrunning", es decir, el número de consultas, conexiones de rosca y el número de subprocesos que se ejecutan.

Podemos ejecutar la siguiente secuencia de comandos al servidor de monitor de MySQL se está ejecutando valor de estado

#!/bin/bash
while true
do
mysqladmin -uroot -p"密码" ext | awk '/Queries/{q=$4}/Threads_connected/{c=$4}/Threads_running/{r=$4}END{printf("%d %d %d\n",q,c,r)}' >> status.txt
sleep 1
done

Ejecutar la secuencia de comandos durante 24 horas para obtener status.txt en el contenido, de nuevo el número de solicitudes por servicios de segunda MySQL == == calculado por awk

awk '{q=$1-last;last=$1}{printf("%d %d %d\n",q,$2,$3)}' status.txt

El contenido copia calculado a gráfico de Excel generado observó periódicamente datos.

Si los cambios cíclicos datos observados, como en la figura interpretación necesidad de modificar la política de caché invalidación.

Por ejemplo:

En [3,6,9] en el que el número aleatorio adquirida por el valor de intervalo como un tiempo de un fallo de caché, la caducidad de la caché de manera dispersa, ahorrando así una porción de consumo de memoria.

Cuando se accede a la cima de la parte dividida de la solicitud a un fallo de caché, la otra parte es un acceso de base de datos MySQL, lo que reduce el servidor MySQL presión.

En cuarto lugar, la necesidad de obtener sentencias SQL optimizadas

4.1 Método 1: Ver el hilo conductor

Ejecutar el comando:

show processlist

return resultado:

mysql> show processlist;
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host      | db   | Command | Time | State    | Info             |
+----+------+-----------+------+---------+------+----------+------------------+
|  9 | root | localhost | test | Query   |    0 | starting | show processlist |
+----+------+-----------+------+---------+------+----------+------------------+
1 row in set (0.00 sec)

A partir de los resultados devueltos, podemos entender lo que el hilo de ejecutar el comando / SQL y el tiempo de ejecución. aplicación práctica, la consulta devuelve un resultado no será N registros.

Entre ellos, el valor de retorno del Estado es la clave para juzgar bien o mal desempeño , sus aparezca siguiente valor, las filas necesitan para optimizar la instrucción SQL:

Converting HEAP to MyISAM # 查询结果太大时,把结果放到磁盘,严重
Create tmp table #创建临时表,严重
Copying to tmp table on disk  #把内存临时表复制到磁盘,严重
locked #被其他查询锁住,严重
loggin slow query #记录慢查询
Sorting result #排序

4.2 manera: activar el registro de consultas lentas

En el my.cnf archivo de configuración en el [mysqld] añadir la siguiente línea de dos parámetros:

slow_query_log = 1
slow_query_log_file=/var/lib/mysql/slow-query.log
long_query_time = 2

log_queries_not_using_indexes = 1

En donde, slowquerylog = 1 indica girando consulta lenta; slowquerylogfile representa lenta ubicación de almacenamiento de registro de consultas; longquerytime = 2 indica que la consulta> = 2 segundos antes del registro; logqueriesnotusing_indexes = 1 grabación no utiliza el índice de declaración de SQL.

Nota: La ruta puede slowquerylog_file no sólo de escritura, de lo contrario, podría no tener permiso para MySQL los archivos de registro del servidor escribe en el directorio especificado. ruta recomendada copiada directamente encima.

Después de modificar guardar el archivo, reinicie el servicio MySQL. Se crea un archivo de registro-query.log lenta en / var / lib / mysql / directorio. Conexión con un servidor MySQL puede ejecutar el siguiente comando para ver la configuración.

show variables like 'slow_query%';

show variables like 'long_query_time';

Prueba de registro de consultas lentas:

mysql> select sleep(2);
+----------+
| sleep(2) |
+----------+
|        0 |
+----------+
1 row in set (2.00 sec)

Abra el archivo de registro de consultas lentas

[root@localhost mysql]# vim /var/lib/mysql/slow-query.log
/usr/sbin/mysqld, Version: 5.7.19-log (MySQL Community Server (GPL)). started with:
Tcp port: 0  Unix socket: /var/lib/mysql/mysql.sock
Time                 Id Command    Argument
# Time: 2017-10-05T04:39:11.408964Z
# User@Host: root[root] @ localhost []  Id:     3
# Query_time: 2.001395  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
use test;
SET timestamp=1507178351;
select sleep(2);

Podemos ver tan sólo dos segundos para realizar una instrucción SQL que desea grabar.

Aunque el registro de información de consulta SQL lenta en el registro de consultas lentas, pero los registros de un intenso y difícil de ver. Por lo tanto, tenemos que filtrar a través de herramientas de SQL.

MySQL proporciona mysqldumpslow  herramienta para el análisis de registro . Podemos utilizar mysqldumpslow comando --help para ver el uso correspondiente.

Los parámetros comunes son los siguientes:

    -s:排序方式,后边接着如下参数
        c:访问次数
        l:锁定时间
        r:返回记录
        t:查询时间
    al:平均锁定时间
    ar:平均返回记录书
    at:平均查询时间
    -t:返回前面多少条的数据
    -g:翻遍搭配一个正则表达式,大小写不敏感

caso:

获取返回记录集最多的10个sql
mysqldumpslow -s r -t 10 /var/lib/mysql/slow-query.log

获取访问次数最多的10个sql
mysqldumpslow -s c -t 10 /var/lib/mysql/slow-query.log

获取按照时间排序的前10条里面含有左连接的查询语句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/slow-query.log

 

V. Análisis de sentencias SQL

5.1 Método 1: explicar

Proyectado SQL problemático, podemos utilizar el suministrado explicar el caso de MySQL vista SQL plan de ejecución (tabla de asociación, secuencia de consulta de tabla, el uso de índices, etc.).

uso:

explain select * from category;

return resultado:

mysql> explain select * from category;
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | category | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    1 |   100.00 | NULL  |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

Los campos explicó: 1) Identificación: seleccionar el número de secuencia de la consulta. El mismo ID, el orden de ejecución de arriba a abajo; diferente ID, mayor será el valor de ID de mayor prioridad, el primero en ser ejecutados

2) SELECT_TYPE: tipo de datos de consulta de operación, que los valores son los siguientes:

  • sencilla: una simple consulta, no contiene sub-consultas o unión
  • primaria: contienen complejos sub-consultas, las marcas de consultas externas para el valor
  • subconsulta: o cuando los seleccione subconsultas que comprenden, este valor está marcado
  • derivados: sub-consulta incluido en la lista están marcados partir de este valor, MySQL de forma recursiva estos sub-consultas, los resultados en una tabla temporal
  • Unión: si el segundo aparece seleccione después de la unión, fueron marcados para ese valor. Si la unión incluido en la consulta sub de la capa externa está etiquetado seleccione derivada
  • resultado de la unión: obtener los resultados de la tabla de unión seleccionar

3) Mesa: visualización de los datos de línea en el que las tablas

4) particiones: un partido de partición

5) tipo: el tipo de tabla de conexión, su valor, las siguientes propiedades en el extremo de un orden alto:

  • Sistema: la tabla sólo tiene una fila, correspondiente a las tablas del sistema
  • const: una vez a través del índice de encontrar una sola fila de datos coincidentes
  • eq_ref: índice único scan, para cada clave de índice, sólo un registro en el partido de la tabla. Comúnmente utilizado en la exploración de índice de clave única o primaria
  • ref: exploración índice no único, devuelve todas las filas que coinciden con un valor separado. A =, <o> operador indexado columnas
  • rango: sólo recupera una fila de un rango dado, utilizando un índice para seleccionar las filas. Generalmente se usa entre,>, <situación
  • Índice: sólo el recorrido del árbol de índice
  • TODOS: escaneo completo de tabla, el peor desempeño

Nota: Los cinco primeros casos son el uso de índices situación ideal. Por lo general, al menos optimizado para el rango de nivel, lo mejor es optimizar el árbitro

6) possible_keys: MySQL, que indican índice para su uso en esta tabla para encontrar las filas. Si el valor es NULL, no se utiliza la descripción del índice pueden ser indexados para mejorar el rendimiento

7) clave: Muestra el índice de MySQL utiliza realmente. Si es NULL, entonces no utilice la consulta al índice

8) key_len: número de bytes utilizados en el índice, dicho índice utilizado en la consulta se calcula la longitud de la columna. Sin pérdida en la precisión, más corta es la longitud, mejor será la pantalla es la longitud máxima del campo de índice, no la longitud real

9) Ref: muestra los campos de índice asociados a la tabla qué campos de las tablas

10) filas: Las estadísticas de la tabla de selección y el caso, una estimación aproximada del número de líneas necesarias para localizar la grabación o la lectura deseada, cuanto menor sea el valor, mejor

11) filtrada: el porcentaje del número de filas devueltas resultados que representan el número de filas de lectura, el mejor el valor

12) adicional: contener inapropiada representada en las otras columnas pero la información adicional es muy importante, los valores comunes son los siguientes:

  • usando filesort: MySQL se describirá utilizando un índice de pedido de datos externo, en lugar de la lectura de la orden de índice en la tabla. La aparición de valor, se debe optimizar SQL
  • usando temporal: el uso de una tabla temporal para almacenar resultados intermedios, MySQL utilizar tablas temporales cuando se ordenan los resultados de la consulta. Común con el fin de ordenar y agrupar consulta por grupo. La aparición de valor, se debe optimizar SQL
  • utilizando el índice: representado por un selecto operaciones utilizando el índice de cubierta, para evitar filas de la tabla de acceso de datos correspondiente, una buena eficiencia
  • usando siendo: siendo restringe cláusula que line
  • join usando buffer: Uso de almacenamiento en caché de conexión
  • distinta: la primera encontrar un minucioso partido, parada para la combinación fila actual de más líneas

Nota: Antes de la llegada de dos valores, las sentencias SQL deben ser optimizados.

5.2 La segunda manera: perfiles

Utilice el comando de perfiles para obtener más información sobre las sentencias SQL están consumiendo recursos (coste de cada paso de la ejecución).

5.2.1 Visualización caso perfil abierto

select @@profiling;

return resultado:

mysql> select @@profiling;
+-------------+
| @@profiling |
+-------------+
|           0 |
+-------------+
1 row in set, 1 warning (0.00 sec)

0 representa apagado, a su vez 1 representa

5.2.2 Activar el perfil

set profiling = 1;  

return resultado:

mysql> set profiling = 1;  
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select @@profiling;
+-------------+
| @@profiling |
+-------------+
|           1 |
+-------------+
1 row in set, 1 warning (0.00 sec)

Después se cierra la conexión, el estado de perfiles se establece automáticamente en el estado cerrado.

Ver una lista de SQL ejecutada 5.2.3

show profiles;

return resultado:

mysql> show profiles;
+----------+------------+------------------------------+
| Query_ID | Duration   | Query                        |
+----------+------------+------------------------------+
|        1 | 0.00062925 | select @@profiling           |
|        2 | 0.00094150 | show tables                  |
|        3 | 0.00119125 | show databases               |
|        4 | 0.00029750 | SELECT DATABASE()            |
|        5 | 0.00025975 | show databases               |
|        6 | 0.00023050 | show tables                  |
|        7 | 0.00042000 | show tables                  |
|        8 | 0.00260675 | desc role                    |
|        9 | 0.00074900 | select name,is_key from role |
+----------+------------+------------------------------+
9 rows in set, 1 warning (0.00 sec)

Antes de ejecutar el comando, las sentencias SQL sólo se necesitan para realizar una grabación adicional.

5.2.4 Consultas ID detalles de ejecución especificado

show profile for query Query_ID;

return resultado:

mysql> show profile for query 9;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000207 |
| checking permissions | 0.000010 |
| Opening tables       | 0.000042 |
| init                 | 0.000050 |
| System lock          | 0.000012 |
| optimizing           | 0.000003 |
| statistics           | 0.000011 |
| preparing            | 0.000011 |
| executing            | 0.000002 |
| Sending data         | 0.000362 |
| end                  | 0.000006 |
| query end            | 0.000006 |
| closing tables       | 0.000006 |
| freeing items        | 0.000011 |
| cleaning up          | 0.000013 |
+----------------------+----------+
15 rows in set, 1 warning (0.00 sec)

Cada línea es un proceso de cambio de estado, así como su duración. Estado de esta columna y mostrar processlist de Estado es el mismo. Por lo tanto, la atención debe ser optimizado en los mismos puntos que se ha descrito anteriormente.

5.2.5 obtener la CPU, Block IO y otra información

show profile block io,cpu for query Query_ID;

show profile cpu,block io,memory,swaps,context switches,source for query Query_ID;

show profile all for query Query_ID;

En sexto lugar, los métodos de optimización

Principalmente en la optimización de consultas, la indexación y la estructura de la tabla utilizando el diseño de explicar.

6.1 Optimización de consultas

1) Evitar * SELECT, los datos que se necesitan, se consulta el campo correspondiente.

2) pequeño gran mesa de mesa impulsada, es decir, pequeño conjunto de datos para conducir grandes conjuntos de datos. Tales como: la A, B dos tabla, por ejemplo, mediante la asociación de campo id dos tabla.

Cuando B es menor que un conjunto de tabla de datos de la tabla, Optimización en existir; utilizado en, se lleva a cabo dos tablas para comprobar la secuencia de la Tabla B, la Tabla A y a continuación, comprobar

select * from A where id in (select id from B)

Cuando A es menor que B la mesa conjunto de datos de mesa, existen Optimización en; usando existe, dos tablas se realiza para verificar la secuencia de la Tabla A, la Tabla B y a continuación, comprobar

select * from A where exists (select 1 from B where B.id = A.id)

3) En algunos casos, la conexión se puede utilizar en lugar de las sub-consultas, ya que el uso de unirse, MySQL no creará una tabla temporal en la memoria.

4) añade de forma adecuada un campo redundante, reducir la tabla asociada.

5) el uso racional del índice (descrito a continuación). Tales como: ordenar, agrupar, campos de índice, para evitar la filesort. Más: índice de MySQL a una estructura de datos y optimizar el inventario

6.2 Uso Índice

6.2.1 para el uso del índice de escenas

1) clave primaria crea automáticamente un índice único

2) campo con frecuencia como las condiciones de la consulta

El campo 3) la consulta asociada con otras tablas

4) Clasificar los campo de consulta

5) campo de consulta o grupo estadístico

6.2.2 escenas no aptas para el índice de utilización

1) Campos de actualización frecuente

2) con condiciones de campo donde menos de

3) tabla registra también

4) CRUD tabla periódica

5) el valor del campo diferencia o poco alta repetibilidad

6.2.3 principios de creación de índice y de uso

1) una sola tabla de consulta: ¿Qué columnas para la consulta, crear un índice en la columna

2) consultas multi-mesa: Cuando dejaron unirse, el índice agregado al campo derecho tabla relacionada, cuando se unen a la derecha, el índice añade a la tabla de correspondencias del jardín izquierdo

3) No realice ninguna operación (cálculo, la conversión de tipo) índice de la columna

4) No utilice la columna de índice! =, <> No igual

5) el índice de la columna no está vacío, y no uso es nulo o no nulo está analizando

6) El campo de índice es un tipo de cadena, la condición de consulta para aumentar el valor de 'comillas simples, escriba la parte inferior para evitar la conversión automática

Contraria a los principios anteriores puede resultar en una falla del índice, las circunstancias específicas tienen que explicar comando para visualizarla

6.2.4 Fallo caso índice

Además de la violación de los principios de la creación de índices y uso, las siguientes circunstancias pueden llevar a una insuficiencia del índice:

1) Cuando la consulta difusa, comenzando con%

2) al usar o, como: campo de 1 (no indexado) o el campo 2 (índice) causará índice de fracaso.

3) Cuando se utiliza un índice compuesto, sin usar una primera columna de índice.

índice (a, b, c), a campo a, b, c como un índice compuesto, por ejemplo:

toda la red de la práctica más amplia optimización de rendimiento de MySQL, programador batalla frases esenciales!  !  !

 

6.3.1 Seleccionar la estructura de la tabla de base de datos apropiada tipo de datos 6.3 Diseño

1) El uso es posible almacenar datos de un tipo de datos mínimo

2) el uso de tipos de datos sencillos. tipo varchar int en proceso mysql que la simple

3) hacer uso tinyint, smallint, MEDIUMINT más que como int tipo integral

4) definen el campo tanto como sea posible utilizar no nulo, porque nulo ocupan 4 bytes de espacio

5) reducir al mínimo el uso del tipo de texto, no es aconsejable tener en cuenta cuando se utiliza un no-subtabla

6) Trate de usar en lugar de la fecha y hora fecha y hora

7) No tienen demasiados campo de tabla única, dentro de la recomendada 20

6.3.2 Dividir tabla

Cuando los datos en la base de datos es muy grande, plan de optimización de consulta no resolverá el problema de consultas lentas, podemos considerar la división de tablas, cada tabla para que los datos se convierte, mejorando así la eficiencia de la consulta pequeña.

1) Vertical Dividir: una pluralidad de columnas de la tabla se separa en diferentes tablas. Por ejemplo, algunos de los campos en la tabla de usuario se accede con frecuencia, estos campos de una tabla, una serie de campos adicionales no se utilizan en otra tabla. Cuando los datos de inserción, el uso de transacciones para garantizar la coherencia de datos de dos tablas.

2) división horizontal: división en filas. tabla de usuario, por ejemplo, ID de usuario, ID de usuario para el acceso a más de 10, la distribución uniforme de los datos de usuario para el usuario 10 en la Tabla 0-9. Cuando Encuentre también consulta de datos de acuerdo con esta regla.

6.3.3 lectura y escritura separada

En circunstancias normales para la base de datos son "lectura-escritura menos". En otras palabras, la presión de la base de datos sobre todo porque un gran número de operaciones para leer datos causados. Podemos utilizar las soluciones de clúster de base de datos, utilice la biblioteca principal como una biblioteca, es responsable de escribir datos; otra biblioteca de la biblioteca, es responsable de la lectura de datos. Esto aliviará la presión sobre el acceso a la base de datos.

Siete, los parámetros de ajuste del servidor

7.1 memoria relacionados

sortbuffersize tipo de tamaño de búfer de memoria

tamaño de memoria intermedia utilizando el joinbuffersize conexión

Cuando la tabla de análisis completo del búfer asignado tamaño readbuffersize

relacionadas 7,2 IO

tamaño de registro de transacciones Innodblogfile_size

número Innodblogfilesingroup de registros de transacciones

transacción Innodblogbuffer_size tamaño del búfer de registro

Innodbflushlogattrx_commit estrategia de actualización de registro de transacciones, sus valores son los siguientes:

0: escribir cada segundo caché de registro, y el registro de descarga a disco

1: presentado a la caché de escritura de registro de cada transacción, y el registro de descarga a disco

2: Cada vez que se confirma una transacción, los datos de registro de ejecución escritos en la memoria caché, ejecute una vez por segundo registro de descarga a disco

Relacionados con la seguridad 7.3

expirelogsdays especifican la limpieza automática del número de días binlog

maxallowedpacket MySQL puede controlar el tamaño del paquete recibido

Desactivar DNS lookup skipnameresolve

read_only prohibir el permiso del usuario el permiso de escritura no súper

nivel skipslavestart utiliza la recuperación automática de esclavos

7.4 Otros

número máximo de conexiones permitidas por las max_connections de control

tmptablesize tamaño de la tabla temporal

maxheaptable_size mesa de tamaño máximo de memoria

Yo no utilizar estos parámetros para el ajuste del servidor MySQL, los resultados de rendimiento y presentar a los detalles específicos, consulte la información al final del artículo o de lo contrario Baidu.

Ocho, compra de hardware y optimización de parámetros

Rendimiento del hardware determinan directamente el rendimiento de la base de datos MySQL. cuellos de botella de rendimiento del hardware, determina directamente la eficiencia de los datos operativos y bases de datos MySQL.

Como un programador desarrollador de software, nos centramos en el software de optimización de contenidos para optimizar el hardware como se puede entender

8.1 memoria relacionada

IO memoria más rápida que una gran parte del disco duro, se puede aumentar la capacidad de amortiguación del sistema, los datos permanecen más tiempo en la memoria para reducir disco IO

relacionadas-O 8.2 disco I /

1) utilizando SSD o dispositivo SSD PCle, obtener al menos varios cientos o incluso miles de veces de elevación IOPS

2) simultáneamente con la matriz de tarjeta de adquisición y módulo de memoria caché BBU, puede mejorar significativamente IOPS

3) la medida de lo posible selección de RAID-10, RAID-5 en vez

8.3 CUP relacionados con la configuración

En el servidor de configuración del BIOS, ajustado de la siguiente manera:

1) Seleccione el modo de rendimiento por vatio optimizado (DAPC), jugar el máximo rendimiento de la CPU

2) Cerrar C1E C Unidos y otras opciones, mejorar la eficiencia de la CPU

3) Frecuencia de la memoria (memoria de frecuencia) seleccionado de máximo rendimiento

Publicados 239 artículos originales · ganado elogios 48 · Vistas a 30000 +

Supongo que te gusta

Origin blog.csdn.net/Sqdmn/article/details/105014220
Recomendado
Clasificación