Grieta de la pared sugerimos: Los desarrolladores aprenderán unos pocos puntos de optimización de SQL

Haga clic en el azul " espacio de Python " Ah mi atención

Añadir una " estrella " de aprendizaje felices juntos todos los días


来源:https://www.cnblogs.com/xiaoyangjia/p/11267191.html


Bloggers responsables del proyecto, principalmente base de datos MySQL Ali nube, SQL recientes alarmas lentos se producen con frecuencia, incluso el tiempo de ejecución más largo hasta 5 minutos. Tras el análisis de registro de exportación, que resultó ser la razón principal para no golpear y ningún proceso de índice de paginación . De hecho, esto es un error muy bajo nivel, no puedo evitar volver un lugar fresco, nivel técnico de las necesidades de los miembros del equipo para ser mejorada ah. El proceso de transformación de éstos SQL, resumió cierta experiencia para compartir con usted, si hay un error de la crítica de bienvenida.

01

rendimiento de MySQL

1. La cantidad máxima de datos

A pesar de la cantidad de datos y el número de concurrentes, hablar sobre el rendimiento de la intimidación . MySQL hay límite en el número máximo de registros en una sola tabla, que depende del límite del sistema operativo del tamaño del archivo.

Sistema de archivos límite de tamaño de archivo único
FAT32 El mayor 4G
NTFS máximo de 64 GB
NTFS5.0 El 2TB máximo
EXT2 Bloquear tamaño es de 1024 bytes, la capacidad máxima del archivo de 16GB; tamaño de bloque de 4096 bytes, la capacidad máxima de la 2TB archivo
EXT3 Bloquear el tamaño es de 4 KB, la capacidad máxima de 4 TB del archivo
EXT4 La teoría puede ser mayor que 16 TB

sub-biblioteca subtabla "Manual de Ali Baba Desarrollo de Java" presentado una sola filas de la tabla de más de 5 millones de líneas o la capacidad de una sola mesa de más de 2 GB, se recomienda. El rendimiento se determina por una combinación de factores, dejar a un lado la complejidad del negocio, el impacto es seguido por la configuración del hardware, configuración de MySQL, diseño de la tabla de datos, optimización de índices. 5000000 Este valor es sólo para referencia, no una ley de hierro.

Los bloggers han estado operando sobre una sola tabla de más de 400 millones de filas de datos, paginación, comprobar los últimos 20 registros de toma 0.6 segundos, las sentencias SQL son generalmente

select field_1,field_2 from table where id < #{prePageMinId} order by id desc limit 20

prePageMinId ID es el más pequeño de los registros de datos anteriores. En ese momento, la velocidad de consulta de acuerdo, ya que los datos sigue creciendo, un día debe ser abrumado. Sub-biblioteca subtabla es mucho tiempo y gran trabajo de alto riesgo, debe tratar de optimizar la estructura actual, como actualizar el hardware, los datos históricos de migración, etc., Meizhe subdivisión.

Sub-biblioteca de subtabla para los estudiantes interesados ​​pueden leer idea básica de la sub-biblioteca sub-tabla:

https://www.cnblogs.com/jshen/p/7682502.html


2. El número máximo de concurrente

El número de base de datos concurrente puede referirse al mismo tiempo el número de peticiones procesadas, está determinado por las max_connections y max_user_connections.

se refiere al número máximo de conexiones max_connections ejemplo MySQL, el valor límite superior es de 16.384, max_user_connections es el número máximo de conexiones de bases de datos por usuario.

MySQL proporcionará una memoria intermedia para cada conexión, lo que significa que consume más memoria. Si las conexiones son demasiado altos hardware demasiado, es demasiado baja y no se puede aprovechar al máximo el hardware. Requisitos generales para tanto la relación excede de 10%, calculado como sigue:

max _used_ conexiones / max_connections * 100% = 3/100 * 100% ≈ 3%

Ver el número máximo de conexiones y el número máximo de conexiones de respuesta:

show variables like '%max_connections%';show variables like '%max_user_connections%';
在配置文件 my.cnf 中修改最大连接数

[mysqld]max_connections = 100max_used_connections = 20


3. Consulta tomó 0.5 segundos

Recomienda que una sola consulta tomó el control en menos de 0,5 segundos, 0,5 segundos es una experiencia, a partir de la experiencia del usuario tres principios segundos . Si la operación del usuario no responde dentro de tres segundos, lo hará incluso por aburrimiento. Tiempo de respuesta = UI representación solicitudes de red cliente procesa solicitudes tramitadas + + + proceso que consume el consumo de consulta de base de datos, el tiempo de procesamiento es de 0.5 segundos en el reloj 1/6 base de datos.


4. La aplicación del principio

la base de datos NoSQL comparación, MySQL es un chico frágil delicada. Es como los estudiantes de sexo femenino en la educación física, y que una pequeña discusión sobre los estudiantes que discuten (expansión difícil), llevó a cabo dos pasos fuera de la respiración (baja capacidad pequeña concurrente), a menudo mal a dejar (limitaciones de SQL demasiado).

Hoy vamos a señalar una expansión aplicación distribuida es mucho más fácil que la base de datos, por lo que la aplicación del principio de la base de datos menos trabajo, más aplicaciones de trabajo .

  • Pero no aprovechar al máximo el índice de abuso, valores de índices también consumen disco y CPU.

  • No se recomienda utilizar la función de base de datos para dar formato a los datos para el proceso de solicitud.

  • No se recomienda usar restricciones de clave externa para garantizar la exactitud de los datos con la aplicación.

  • Write Once Read Many pequeñas escenas, no se recomienda el uso de un índice único, utilizar la aplicación para garantizar la unicidad.

  • campo redundante apropiada, tratar de crear una tabla intermedia, resultados intermedios de cálculos con la aplicación, el espacio para el tiempo.

  • No se permite llevar a cabo los asuntos extremadamente lento, con la división de aplicación en transacciones más pequeñas.

  • hoja estimado importante de datos (como tabla de orden) y crecimiento de los datos de carga, avance Optimizar.


02

diseño de la tabla de datos

1. Tipo de datos

Seleccione principales tipos de datos: simple o más huella más pequeña.

  • Si la longitud puede ser satisfecha, para hacer uso de un número entero tinyint, smallint, medium_int no Int.

  • Si se determina la longitud de cadena, utilizando el tipo char.

  • Si varchar se encuentran, sin necesidad de utilizar el tipo de texto.

  • El uso de alta precisión tipo decimal, BIGINT también se puede usar, tal como dos precisión decimal multiplica por 100 para guardar.

  • Trate de usar marca de tiempo en lugar de fecha y hora.

tipo ocupar bytes descripción
fecha y hora 8 bytes '01/01/1000 00: 00: 00.000000' a '9999-12-31 23: 59: 59.999999
fecha y hora 4 bytes '1970-01-01 00: 00: 01,000000' a '19/01/2038 03: 14: 07,999999'

En comparación con fecha y hora, fecha y hora que ocupen menos espacio, la zona de almacenamiento se convierte automáticamente al formato de hora UTC.


2. Evitar nula

MySQL en el campo es todavía espacio nulo, hará que el índice, las estadísticas de índices más complejos. valor NULL se actualiza a una actualización no NULL no se puede hacer in situ a partir, propensos a la fractura afecta al rendimiento del índice. El valor NULL en lugar de como un valor significativo puede evitarse que contiene una instrucción SQL is not nulldeterminación.


3. Optimización de tipo de texto

Desde el campo de texto para almacenar grandes cantidades de datos, la capacidad de la mesa va a subir temprano, que afecta al rendimiento de otros campos de investigación. Recomendamos atraídos hacia fuera en la tabla secundaria, la clave natural asociado.


4. optimización de índices

1) Índice de Clasificación

  1. Índice ordinaria: índice básico.

  2. índice Compuesto: indexación de la pluralidad de campos, el material compuesto se puede acelerar consulta recuperación.

  3. El único índice: igual que los índices normales, pero el valor de las columnas de índice deben ser únicos, permiten valores nulos.

  4. Una combinación de un índice único: una combinación de valores de la columna debe ser único.

  5. índice de clave principal: índice único especial, un récord para un conjunto de datos de identificación únicos en la tabla, permite nulos, por lo general con una restricción de clave primaria.

  6. índice de texto: para consulta de texto en masa, InnoDB y MyISAM después de ayuda MySQL5.6 la indización de texto. Debido a la precisión de consulta y escalabilidad pobres, más compañías eligen Elasticsearch.

2) optimización de índices

  1. Paginación de consulta es muy importante, si la cantidad de datos de la consulta supera el 30%, MySQL no utiliza el índice.

  2. Solo número índice de la tabla no más de 5, no más de cinco un único número de campo de índice.

  3. Índice de Prefijo de cadena puede ser utilizada, la longitud del prefijo de los caracteres de control 5-8.

  4. El único campo es demasiado baja, aumentar el índice no tiene sentido, como por ejemplo: si se debe quitar el género.

El uso racional de un índice de recubrimiento, como sigue:

select login_name, nick_name from member where login_name = ?
login_name, nick_name两个字段建立组合索引,比login_name简单索引要更快


5. Optimización de SQL

1) lote

Bloggers ver a un niño estanques excavados un pequeño agujero en el desagüe, el agua que hay todo tipo de desechos flotantes. La lenteja de agua y hojas siempre pueden pasar a la salida, y bloquearán otros objetos a través de las ramas, y en ocasiones quedan atascados, la necesidad de limpieza manual.

MySQL es un estanque de peces, y el número máximo de ancho de banda de red concurrente es la salida, el usuario de SQL está flotando. Las consultas que no tienen parámetros de paginación, o el impacto de grandes cantidades de actualización de datos y operaciones de borrado, todas las ramas, queremos que se rompa un proceso por lotes, ejemplo:

Descripción de actividad: los usuarios actualizar todos los cupones vencidos disponible.

sentencia SQL:

update status=0 FROM `coupon` WHERE expire_date <= #{currentDate} and status=1;

Si es necesario actualizar el estado disponible un gran número de cupones, ejecuta el SQL puede ser bloqueado otra SQL, el procesamiento por lotes de la pseudo-código es el siguiente:

int pageNo = 1;
int PAGE_SIZE = 100;
while(true) {
    List<Integer> batchIdList = queryList('select id FROM `coupon` WHERE expire_date <= #{currentDate} and status = 1 limit #{(pageNo-1) * PAGE_SIZE},#{PAGE_SIZE}');
    if (CollectionUtils.isEmpty(batchIdList)) {
        return;
    }
    update('update status = 0 FROM `coupon` where status = 1 and id in #{batchIdList}')
    pageNo ++;
}

2) los operadores <> Optimización

Típicamente <> operador no puede utilizar el índice, por ejemplo de la siguiente manera, la consulta no es la cantidad de $ 100 órdenes:

select id from orders where amount != 100;

Si la cantidad es menor de 100 pedidos de distribución rara, grave desigual de datos tales circunstancias, es posible utilizar el índice. Dada esta incertidumbre, los resultados de búsqueda mediante la unión de polimerización, reescrita como sigue:

(select id from orders where amount > 100) union all(select id from orders where amount < 100 and amount > 0)


3) o la optimización

En INNODB o no puede usar el índice compuesto, tales como:

select id,product_name from orders where mobile_no = '13421800407' or user_id = 100;

Mobile_no + user_id no golpear o combinación de índice, Unión empleada, de la siguiente manera:

(select id,product_name from orders where mobile_no = '13421800407') union(select id,product_name from orders where user_id = 100);
此时id和product_name字段都有索引,查询才最高效。


4) optimización EN

En gran mesa principal para la tabla secundaria pequeña, existen mesa principal para la tabla de niño grande. Debido a que el optimizador de consultas escalada, muchas escenas tanto en rendimiento casi la misma cosa.

Procurad, más bien consulta de combinación, por ejemplo, de la siguiente manera:

select id from orders where user_id in (select id from user where level = 'VIP');

El uso que se ilustra a continuación:

select o.id from orders o left join user u on o.user_id = u.id where u.level = 'VIP';

5) no realizar la operación de la columna

Consulta de condiciones a través de la operación aritmética columna conducirán al índice de fallo, como sigue:

órdenes del día Consultas

select id from order where date_format(create_time,'%Y-%m-%d') = '2019-07-01';

date_format función hace que la consulta no puede utilizar el índice, después de la reescritura:

select id from order where create_time between '2019-07-01 00:00:00' and '2019-07-01 23:59:59';

6) Evitar seleccionar todo

Si no consultar todas las columnas en la tabla, para evitar el uso SELECT *, que será un escaneo completo de tabla, no se puede utilizar con eficacia el índice.


7) Al igual que la optimización

como una consulta difusa, por ejemplo (campo indexado):

SELECT column FROM table WHERE field like '%keyword%';

Esta consulta se pierde el índice y se sustituye por el texto siguiente:

SELECT column FROM table WHERE field like 'keyword%';

Además de la consulta anterior% golpeará el índice, pero el gerente de producto debe ser coincidencia parcial antes y después de él? Indización de texto texto completo se puede tratar, pero Elasticsearch es el arma definitiva.


8) La optimización de Ingreso

Únete a lograr es el uso de Nested Loop Unirte algoritmo, el resultado es fijado por la unidad como la tabla de datos de base, los datos a través del nodo al siguiente como un ciclo de datos consulta de tabla condición de filtro, entonces se combinan los resultados. Si se unen múltiples, frente al resultado se establece que los datos cíclicos después de una re-consulta las tablas de datos.

  1. mesa de ping-conducido y aumento consulta impulsada como para satisfacer la condición ON y menos Cuando, con poca conjunto de resultados para conducir grandes conjuntos de resultados.

  2. Se indexa y se unen campo en la tabla de unidad, el tiempo no puede ser indexado, suministro de fondos suficientes Únete tamaño del búfer.

  3. Prohíben unirse a más de conexión de tres tablas, intente aumentar el campo de redundancia.


9) La optimización del límite

Cuando la consulta para el límite de paginación junto a su vez un peor rendimiento, solución de principio: Reducir el área de escaneado , como se muestra a continuación:

select * from orders order by id desc limit 100000,10 耗时0.4秒select * from orders order by id desc limit 1000000,10耗时5.2秒

Identificación primero tamizados a limitar la búsqueda, redactado como sigue:

select * from orders where id > (select id from orders order by id desc  limit 1000000, 1) order by id desc limit 0,10耗时0.5秒

Si las condiciones de la consulta sólo el ID de llave maestra, redactado como sigue:

select id from orders where id between 1000000 and 1000010 order by id desc耗时0.3秒

Si el programa anterior es aún muy lento? Tuve que usar el cursor, y amigos interesados ​​en leer JDBC utilice el cursor implementar la paginación consulta

https://www.cnblogs.com/firstdream/p/7732656.html


03

otras bases de datos

Como desarrollador de servicios de fondo, asegúrese competentes en MySQL o SQL Server como el núcleo de almacenamiento, sino también un interés activo en la base de datos NoSQL, que han madurado y se utilizan ampliamente suficiente para resolver los cuellos de botella de rendimiento en escenarios específicos.

clasificación base de datos propiedad
tipo de clave memcache Para el almacenamiento en caché de contenido, de alta carga grandes volúmenes de datos
tipo de clave Redis Para el almacenamiento en caché de contenido, soporte más de los tipos de datos de Memcache, y pueden ser los datos persistentes
almacenamiento columnar HBase Hadoop sistema central de base de datos, almacenamiento de datos estructurados masiva, grandes datos necesarios.
tipo de documento MongoDB base de datos documental conocida también se puede utilizar para la memoria caché
tipo de documento CouchDB proyectos de código abierto Apache, centrándose en la facilidad de uso, soporte para la API REST
tipo de documento SequoiaDB base de datos documental conocida
gráfico Neo4J Mapa de las redes sociales para construir relaciones, sistemas de recomendación
-END-
推荐阅读:
算法题从入门到放弃?刷了几千道算法题,关于如何刷题有些话我想对你说

刷了几千道算法题,这些我私藏的刷题网站都在这里了!

奥利给!有了这么豪横的指南,还愁不会逛 GitHub?!

速观!GitHub 总星 5.4w+,这里藏着 Git 从入门到轻松玩转的秘密!

B站收藏 6.1w+!GitHub 标星 3.9k+!这门神课拯救了我薄弱的计算机基础


????扫描上方二维码即可关注
Publicados 613 artículos originales · ganado elogios 7657 · Vistas 1,33 millones +

Supongo que te gusta

Origin blog.csdn.net/u013486414/article/details/105020876
Recomendado
Clasificación