Descripción general de la estrategia de optimización de MySQL, una de las programaciones de bases de datos PHP

Este artículo describe brevemente la estrategia de optimización de MySQL de la programación de bases de datos PHP. Comparta con usted para su referencia, de la siguiente manera:

Hace unos días vi un artículo que decía que el cuello de botella de PHP no está en PHP en sí mismo en muchos casos, sino en la base de datos. Todos sabemos que en el desarrollo de PHP, la adición, eliminación, modificación y verificación de datos es el núcleo. Para mejorar la eficiencia operativa de PHP, los programadores no solo necesitan escribir código lógicamente claro y eficiente, sino que también pueden optimizar las declaraciones de consulta. Aunque somos impotentes en la velocidad de lectura y escritura de la base de datos, con la ayuda de algunas extensiones de base de datos como memcache, mongodb, redis y otros servidores de almacenamiento de datos, PHP también puede lograr velocidades de acceso más rápidas, así que comprenda y aprenda Estas extensiones también son muy necesarias Este artículo habla primero sobre las estrategias de optimización comunes de MySQL.

Haga clic aquí para unirse a mi grupo de pingüinos

Algunos consejos de MySQL

1. Las palabras clave en las declaraciones SQL se escriben mejor en mayúsculas. Primero, es fácil distinguir entre palabras clave y objetos de operación. En segundo lugar, cuando se ejecutan declaraciones SQL, MySQL las convertirá a mayúsculas. Las mayúsculas manuales pueden aumentar la eficiencia de las consultas ( Aunque pequeño).

2. Si agregamos o eliminamos filas de datos en la base de datos, el ID de datos será demasiado grande. Úselo ALTER TABLE tablename AUTO_INCREMENT=Npara hacer que el ID de incremento automático cuente desde N.

3, para agregar los ZEROFILLdatos de atributo de tipo int se pueden completar automáticamente 0

4. Al importar grandes cantidades de datos, es mejor eliminar primero el índice, insertar los datos y luego agregar el índice; de ​​lo contrario, mysql dedicará mucho tiempo a actualizar el índice.

5. Al crear una base de datos para escribir sentencias sql, podemos crear un archivo con un sufijo .sql en el IDE, que reconocerá la sintaxis sql, lo que facilitará su escritura. Más importante aún, si su base de datos se pierde, aún puede encontrar este archivo y usarlo en el directorio actual /path/mysql -uusername -ppassword databasename < filename.sqlpara ejecutar la instrucción sql de todo el archivo (tenga en cuenta que -u y -p van seguidos del nombre de usuario y la contraseña, sin espacios).

Optimización en el diseño de bases de datos

1. El diseño de la base de datos se ajusta al tercer paradigma y existe una cierta cantidad de redundancia de datos para facilitar las consultas.

2. Seleccione el tipo de datos prioridad int> fecha, hora> enum, char> varchar> blob. Cuando seleccione el tipo de datos, considere reemplazar. Por ejemplo, la dirección IP se puede convertir al tipo unsign int con la función ip2long () para almacenamiento.

3. Para el tipo char (n), el valor de n debe ser lo más pequeño posible cuando los datos estén completos.

4. Usar el comando de partición para particionar una sola tabla al crear una tabla puede mejorar en gran medida la eficiencia de la consulta. MySQL admite los tipos de partición RANGE, LIST, HASH y KEY. Entre ellos, RANGE es el más utilizado. El método de partición es:

CREATE TABLE tablename{
    
    
}ENGINE innodb/myisam CHARSET utf8 //选择数据库引擎和编码
PARTITION BY RANGE/LIST(column),//按范围和预定义列表进行分区
PARTITION partname VALUES LESS THAN /IN(n),//命名分区并详细限定分区的范围

5. Preste atención a la diferencia entre innodb y myisam al elegir un motor de base de datos.

Estructura de almacenamiento : MyISAM se almacena como tres archivos en el disco. Todas las tablas InnoDB se almacenan en el mismo archivo de datos, generalmente 2GB

Soporte de transacciones : MyISAM no proporciona soporte de transacciones. InnoDB proporciona transacciones de soporte de transacciones.

Diferencia de bloqueo de tabla : MyISAM solo admite bloqueos a nivel de tabla. InnoDB admite transacciones y bloqueos a nivel de fila.

Indexación de texto completo : MyISAM admite la indexación de texto completo de tipo FULLTEXT (no se aplica al chino, así que use el motor de indexación de texto completo Sphinx). InnoDB no admite.

El número específico de filas en la tabla : MyISAM guarda el número total de filas en la tabla y el recuento de consultas (*) es rápido. InnoDB no guarda el número total de filas en la tabla y debe recalcularse.

Clave externa : MyISAM no es compatible. Soporte InnoDB

Optimización de índices

1. Innodb es un índice agrupado. Al almacenar el índice, debe haber una clave principal. Si no se especifica, el motor generará automáticamente una clave principal oculta y generará un índice principal. La dirección física de la clave principal se almacena en el índice. Los datos se almacenan mediante la clave principal. Cuando utilice un índice, primero busque el índice principal y luego busque los datos en el índice principal.

La ventaja es que la búsqueda a través de la clave primaria es muy rápida, pero la desventaja es que el índice secundario será lento, porque es necesario encontrar el índice primario a través del índice secundario (la posición del índice primario en el índice secundario), y luego encontrar los datos a través del índice primario. Y si la clave principal es irregular, es necesario mover más bloques de datos al insertar un nuevo valor, lo que afectará la eficiencia, así que intente utilizar un tipo int que aumente regularmente como clave principal. Además, debido a que los datos se colocan inmediatamente después de la clave principal, si hay columnas (texto / blob) con una cantidad particularmente grande de datos en los datos, las consultas innodb omitirán muchos bloques de datos, lo que también provocará lentitud.

2. Los índices de myisam son todos iguales y apuntan uniformemente a la dirección de cada fila en el disco, y todos son datos de puntero livianos. La desventaja es que el establecimiento de cada índice no se realiza a través de la clave principal y la consulta no es tan rápida como el índice agrupado para encontrar la clave principal. Pero debido a que almacena la dirección, la comparación cambia al insertar un nuevo valor.

3. Al realizar consultas de múltiples condiciones, al crear índices para múltiples condiciones por separado, al ejecutar consultas SQL, MySQL solo seleccionará el índice más cercano para usar, por lo que si necesita consultas de múltiples condiciones, cree un índice conjunto, incluso si causará redundancia de datos Más.

Método de establecimiento BTREE de índice conjunto : indexe la primera condición, indexe la segunda condición en el área BTREE del primer índice, y así sucesivamente, por lo que cuando use el índice, no use la primera condición y use la segunda Esta condición no utilizará el índice de articulaciones. Al usar el índice, las condiciones deben ordenarse y usarse en secuencia.

4. La longitud del índice también tiene una gran influencia en la consulta. Debemos intentar crear una longitud de índice corta. Podemos usar la columna de consulta
SELECT COUNT (DISTINCT LEFT (column)) / COUNT (*) FROM tablename para probar la selección al indexar la columna de la columna Diferentes longitudes, qué tan grande es la cobertura del índice, elegimos n longitudes cercanas a la saturación para crear un índice
ALTER TABLE tablename ADD INDEX (column (n)); para indexar los primeros n caracteres de una columna. Si los primeros n caracteres son iguales, incluso podemos invertir el almacenamiento de la cadena y luego construir un índice.

5. El método de mantenimiento para la fragmentación del índice causada por modificaciones frecuentes: ALTER TABLE tablename ENGINE antiguo motor; es decir, aplique el motor de almacenamiento de tablas nuevamente para mantenerlo automáticamente; también puede usar el comando OPTIMIZE tablename para el mantenimiento.

Optimización de consultas de datos

Trate de minimizar las operaciones de la base de datos y trate de no realizar operaciones de datos a nivel de la base de datos cuando haya consultas, pero vuelva al script PHP para manipular los datos y reducir la presión de la base de datos.

Una vez que se descubre un problema de rendimiento de la base de datos, debe resolverse a tiempo. Generalmente, los registros de consultas lentos se utilizan para registrar consultas que son "lentas", EXPLAIN se utiliza para analizar el uso de índices y consultas, y PROFILE se utiliza para analizar el consumo de recursos específicos durante la ejecución de la declaración.

Registro de consultas lento:

1. Agregue bajo [mysqld] en my.ini o my.cnf

  • slow_query_log_file = / path // Establecer la ruta de almacenamiento del registro

  • long_query_time = n // Establecer si el tiempo de ejecución de la declaración alcanza los n segundos, se registrará

2. Luego configure SET slow_query_log = 'ON' en MySQL para habilitar la consulta lenta.

3. Después de grabar el registro, usamos el nombre de archivo mysqldumpslow en el directorio / bin / para ver el registro. Los parámetros comunes son los siguientes:

  • -g patrón usa expresiones regulares

  • -tn devuelve los primeros n datos

  • -sc / t / l / r ordenar por tiempos de registro / tiempo / tiempo de consulta / número de registro devuelto

Declaración EXPLAIN

Cómo usarlo, agregue EXPLAIN antes de la declaración de consulta que se ejecutará

EXPLAIN SELECT * FROM user;

El resultado es el siguiente:

Inserte la descripción de la imagen aquí

La siguiente es una explicación de cada elemento:

id El id de la declaración de la consulta. La consulta simple no tiene sentido y el orden de ejecución de la consulta se puede ver en varias consultas.

El tipo de declaración de consulta ejecutada por select-type corresponde a múltiples consultas, como simple / primaria / unión, etc.

Se puede reservar tabla de datos de consulta instrucción de consulta

tipo El tipo de datos obtenidos, la eficiencia del tipo común de mayor a menor es nulo> const> eq_ref> ref> rango> índice> todos

posibles-claves : posibles índices

Índice utilizado por clave

longitud del índice key_len

Qué columna ref usa junto con el índice para seleccionar de la tabla.

Rows encuentra el número aproximado de filas de datos que se escanearán, puede ver los pros y los contras del índice

Los más comunes son

Use filesort para ordenar los archivos después de consultar los datos, que es más lento y necesita optimizar el índice

usando where lee toda la fila de datos y luego juzga y filtra si cumple con las condiciones de where

Usando la cobertura del índice del índice, es decir, los datos del objetivo ya están almacenados en la tracción y el índice se lee directamente, muy rápidamente.

PERFIL

Use SELECT @@ frofiling para ver el estado de PROFILE.

Si no está encendido, use SET profiling = 1 para encenderlo.

Después de abrir y luego ejecutar la instrucción de consulta, MySQL registrará automáticamente la información del perfil.

Use show profiles para ver toda la información SQL, el resultado es Query_ID Duración Consulta tres columnas de resultados, que son el ID de la consulta, el tiempo empleado y la declaración SQL utilizada.

Nosotros podemos usar

SHOW PFROFILE [type[,type]][FOR QUREY Query_ID][Limit rwo_count [OFFSET offset]]

Los tipos comunes incluyen TODOS (todos), BLOQUE DE E / S (visualización de sobrecarga relacionada con E / S), CPU (sobrecarga de CPU), MEMORIA (sobrecarga de memoria), etc.

Optimizado para almacenamiento grande

Replicación maestro-esclavo de base de datos y separación de lectura y escritura

1. El maestro registra los cambios en el registro binario y el esclavo copia el binario del maestro en su registro de retransmisión y luego devuelve los datos a sus propios datos para lograr el propósito de copiar los datos del servidor maestro.

La replicación maestro-esclavo se puede utilizar para: equilibrio de carga de la base de datos, respaldo de la base de datos, separación de lectura y escritura y otras funciones.

2. Configurar el servidor maestro maestro

修改my.ini/my.conf

[mysqld]

log-bin=mysql-bin //启用二进制日志

server-id=102 //服务器唯一ID

3. Configure el esclavo

log-bin=mysql-bin //启用二进制日志

server-id=226 //服务器唯一ID

4. Autorice el servidor esclavo en el servidor maestro

GRANT REPLICATION SLAVE ON *.* to 'slavename'@'IP' identified by 'root'

5. Usar en el servidor esclavo

change master to 
master_host="masterip",
master_user="masteruser",
master_password="masterpasswd";

6. Luego use el comando start slave para iniciar la replicación maestro-esclavo.

No olvide reiniciar el servidor después de cada modificación de configuración, y luego puede usar show master / slave status para ver el estado de maestro / esclavo en el servidor maestro-esclavo.

La realización de la separación de lectura y escritura de la base de datos depende del middleware MySQL, como mysql_proxy, atlas, etc. Al configurar estos middlewares para separar los servidores maestro y esclavo para lectura y escritura, el servidor esclavo asume la responsabilidad de ser leído, reduciendo así la carga sobre el servidor maestro.

Fragmentación de la base de datos

Cuando la cantidad de datos en la tabla de datos en la base de datos es muy grande, ya sea indexando o almacenando en caché, etc., la presión es grande. Fragmentar la base de datos para almacenarla en múltiples servidores de base de datos o en múltiples tablas para reducir la presión de las consultas.

Hay segmentación vertical, segmentación horizontal y segmentación combinada .

Segmentación vertical : cuando hay muchas tablas de datos, divida las tablas de la base de datos que estén estrechamente relacionadas (como el mismo módulo, a menudo conectado y consulta) y colóquelas en diferentes servidores maestro y esclavo.

Segmentación horizontal : cuando no hay muchas tablas y la cantidad de datos en la tabla es muy grande, para agilizar la consulta se pueden usar algoritmos como el hash para dividir una tabla de datos en varias y ponerlas en diferentes servidores para agilizar la consulta. . La diferencia entre el particionamiento horizontal y el particionamiento de la tabla de datos radica en su medio de almacenamiento.

Segmentación conjunta : en la mayoría de los casos, la cantidad de datos en la tabla de datos y la tabla es muy grande, y luego se requiere una segmentación conjunta, es decir, las divisiones de la tabla vertical y horizontal se realizan al mismo tiempo, y la base de datos se divide en una matriz distribuida para su almacenamiento.

Cada uno de estos métodos de optimización de la base de datos se puede utilizar para escribir un artículo, que puede describirse como extenso y profundo. Después de comprender y recordar estos métodos, puede seleccionar y optimizar a propósito cuando sea necesario para lograr una alta eficiencia de la base de datos.

Presta atención, no te pierdas

Muy bien, todos, lo anterior es todo el contenido de este artículo. Las personas que pueden ver aquí son todos talentos . Como dije antes, hay muchos puntos técnicos en PHP, porque hay demasiados, es realmente imposible de escribir, y no leerás demasiado después de escribirlo, así que lo organizaré en PDF y documentos aquí, si es necesario. lata

Haga clic para ingresar el código secreto: PHP + 「Plataforma」

Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí


Para obtener más contenido de aprendizaje, visite el excelente catálogo de tutoriales de arquitecto PHP de [Comparative Standard Factory], siempre que pueda leerlo para asegurarse de que el salario aumentará un paso (actualización continua)

El contenido anterior espera poder ayudarte . Muchos PHPers siempre encuentran algunos problemas y cuellos de botella cuando están avanzados. No hay sentido de dirección cuando escriben demasiado código comercial. No sé por dónde empezar a mejorar. He compilado información sobre esto, incluyendo Pero no se limita a: arquitectura distribuida, alta escalabilidad, alto rendimiento, alta concurrencia, ajuste del rendimiento del servidor, TP6, laravel, YII2, Redis, Swoole, Swoft, Kafka, optimización de Mysql, scripts de shell, Docker, microservicios, Nginx, etc. Muchos puntos de conocimiento, productos secos avanzados avanzados, se pueden compartir con todos de forma gratuita, y aquellos que lo necesiten pueden unirse a mi grupo de intercambio de tecnología PHP

Supongo que te gusta

Origin blog.csdn.net/weixin_49163826/article/details/109265778
Recomendado
Clasificación