Especificación de rendimiento de SQL

1. Charla

Grabémoslo, a las 00:11:11 del 13 de julio de 2023, el estado actual está realmente ocupado, con un trabajo interminable, espero que la gran presión pueda hacerme crecer rápidamente, recuerda mi viaje, 21 años de universidad después de graduarme , me tomó un año familiarizarme con el software, las teclas de método abreviado y el pensamiento de desarrollo. La base de datos, JS, HTML y Java solo pueden considerarse superficiales, por lo que no elegí el desarrollo de Java en ese momento. Actualmente estoy involucrado en análisis de datos, informe Fanruan y negocios minoristas de catering, que cubren varios escenarios como finanzas, tiendas, productos, miembros, cadenas de suministro y franquiciados. Cada vez siento más que el mundo de los adultos es cruel, cuántas veces pensé en rendirme, pensando que no hay nadie detrás de mí, solo cruzar, así que seguí apretando los dientes y seguir adelante. Publicar con sentimientos ~ Recientemente, el trabajo de horas extra es un poco serio y el blog ha sido descontinuado por mucho tiempo ~

Comparte tus notas de trabajo a continuación~~~

2. Especificación de rendimiento de SQL

Introducción: Estrategias de optimización comúnmente utilizadas en proyectos. Para el contenido de este capítulo, debe dominar las siguientes habilidades:

(1) Comprender la interacción básica entre la memoria y el disco duro durante las operaciones de la base de datos,

(2) Comprender el escaneo de tablas de datos, mejorar la eficiencia de ejecución de SQL en función de la comprensión del escaneo,

(3) Comprender el plan de ejecución, dominar este nivel puede satisfacer las necesidades del 90% de los proyectos.

Idea básica: Cuando ejecutamos una declaración de consulta SQL, la operación de la base de datos es primero obtener datos del disco duro de acuerdo con la declaración SQL y luego cargarlos en la memoria para los cálculos posteriores. Dado que las declaraciones de SQL se ejecutan en secuencia, cuanto menor sea la cantidad de datos consultados por SQL al principio, menor será el tiempo de carga en la memoria y más rápida será la ejecución de SQL.

1. Borrar campos, no tomar redundantes

Explicación : solo tome los campos que necesitamos y no tome los campos que no se usan. No utilice "*" para buscar todo. Por ejemplo:

Suponiendo que la tabla A tiene 10 campos en total, y solo dos de ellos deben usarse, entonces solo los dos campos que necesitamos se toman en la declaración de consulta, que es más rápido que consultar todos los campos.

2. Asociación de tablas grandes, filtrar primero

Explicación : en la declaración de consulta de asociación de tabla grande, filtre primero y luego asocie. Las asociaciones que utilizan WHERE no están permitidas. Filtrar por adelantado puede ahorrar mucho tiempo en la interacción entre el disco duro y la memoria, y en el cálculo de la memoria.

Por ejemplo

 

3. Extraiga elementos comunes y reduzca la duplicación

Explicación : hay muchas subconsultas repetidas en la instrucción SQL, que se pueden extraer y parametrizar para reducir la cantidad de consultas a la base de datos.

Por ejemplo, una subconsulta se reutiliza en la siguiente declaración:

SELECCIONE id_empleado, nombre, apellido,

       (SELECCIONE nombre_departamento DESDE departamentos DONDE id_departamento = empleados.id_departamento) AS nombre_departamento,

       (SELECCIONE PROMEDIO (salario) DE empleados DONDE id_departamento = 80) COMO salario_promedio

DE empleados

DONDE salario > (SELECCIONE PROMEDIO(salario) DE empleados)

ORDEN POR nombre_departamento;

La subconsulta se puede extraer y parametrizar de la siguiente manera:

CREAR VER departamentos_nombres COMO

SELECCIONE id_departamento, nombre_departamento

DESDE departamentos;

CREAR VER avg_salaries COMO

SELECCIONE department_id, AVG (salario) como avg_salary 

DE empleados

GRUPO POR departamento_id;

SELECCIONE employee_id, first_name, last_name, department_names.department_name, avg_salaries.avg_salary

DE empleados

ÚNASE a nombre_departamento EN empleados.id_departamento = nombre_departamento.id_departamento

ÚNASE avg_salaries EN empleados.department_id = avg_salaries.department_id

DONDE salario > (SELECCIONE PROMEDIO(salario) DE empleados)

ORDEN POR nombre_departamento;

Al extraer subconsultas en vistas y usar declaraciones JOIN para conectar tablas relacionadas, puede evitar ejecutar la misma subconsulta varias veces, mejorando así la eficiencia de las consultas.

4. Reduzca los cálculos de escaneo innecesarios

Explicación: si UNION ALL puede cumplir con los requisitos, use UNION ALL en lugar de UNION, porque UNION tendrá un proceso de comparación y deduplicación, pero UNION ALL no.

5. Para las tablas de datos de gran tamaño que se consultan con frecuencia, se deben crear índices y, en la medida de lo posible, se debe realizar el filtrado y la clasificación en las columnas de índice.

Explicación: El índice mejorará la eficiencia de SELECCIONAR, pero afectará la eficiencia de INSERTAR y ACTUALIZAR. No se repetirá aquí la introducción de la indexación, cuándo se debe agregar la indexación y cuándo no se recomienda la indexación.

Como crear:

-- Crear nuevo índice

CREAR ÍNDICE nombre_índice ON nombre_tabla(nombre_columna);

-- crear un índice compuesto

CREAR ÍNDICE nombre_índice ON nombre_tabla(nombre_columna1, nombre_columna2, ...);

-- modificar el índice

ALTER TABLE table_name DROP INDEX index_name;

ALTER TABLE table_name ADD INDEX index_name (column_name1, column_name2, ...);

-- borrar índice

DROP INDEX nombre_índice ON nombre_tabla;

-- Consultar el índice de una sola tabla

MOSTRAR ÍNDICE DESDE table_name;

6. Evite la conversión explícita y la conversión implícita que causan la invalidación del índice

Explicación : evite convertir columnas de índice durante las operaciones de la base de datos, por ejemplo:

(1) Muestre el ejemplo de conversión, suponiendo que la columna de índice son datos de tipo de fecha y compárelos con la fecha de tipo de cadena.

Manera incorrecta: TO_CHAR(T. index column,'YYYYMMDD')>='20190715',

Aquí, se usa una función para convertir la columna de índice de un tipo de fecha a un tipo de cadena, lo que hace que el índice deje de ser válido.

Escritura correcta: T. columna de índice >= TO_DATE('20190715','YYYY-MM-DD')

(2) Para un ejemplo de conversión implícita, suponiendo que la columna de índice es una cadena de números de cadena, se toman los datos cuyo valor de columna de índice es 1.

Manera incorrecta: columna de índice T. = 1

Aquí, la base de datos usa una conversión implícita para convertir el índice de un tipo de cadena a un tipo numérico, lo que hace que el índice deje de ser válido.

Escritura correcta: T. columna de índice = '1'

7. Al consultar tablas grandes, evite clasificar los cálculos en subconsultas, y la clasificación debe colocarse en el último paso del plan de ejecución.

Explicación: intente evitar ORDER BY, DISTINCT y otras declaraciones en las subconsultas. Entre ellos, ORDER BY es para ordenar los resultados, mientras que DISTINCT y GROUP BY son para ordenar durante el cálculo. Cuando la cantidad de datos de la subconsulta sea grande, utilice la cláusula EXISTS en lugar de DISTINCT.

8. En el informe de toma de decisiones, intente fusionar varios conjuntos de datos en el mismo conjunto de datos para reducir el número de concurrencia

Explicación: un conjunto de datos es una concurrencia. Demasiados conjuntos de datos conducen a una alta concurrencia, alta presión de carga de la base de datos y reducción de la eficiencia informática. El número de conjuntos de datos en un informe de decisión se puede reducir con las siguientes opciones:

(1) Correlacione las tendencias mensuales/diarias de los tres indicadores A, B y C según las condiciones año-mes/año-mes-día en lugar de un conjunto de datos separado para cada indicador.

(2) El resultado de la consulta es un conjunto de datos de un registro, que está directamente asociado entre sí. Por ejemplo, tres conjuntos de datos A, B y C devuelven un registro, luego los conjuntos de datos se pueden combinar y procesar como se muestra en la la siguiente figura.

Se recomienda utilizar un conjunto de datos para consultar la comparación año tras año si se puede consultar un conjunto de datos

Como se muestra abajo

 

9. Si el diccionario de datos del control en el informe es demasiado grande e implica vinculación de control, dividir un conjunto de datos en varios conjuntos de datos puede mejorar la eficiencia de carga del control, lo que viola esta regla y debe considerarse apropiado.

3. El comando EXPLICAR

Comando EXPLAIN para ver el plan de ejecución de consultas de MySQL

  1. id: el ID único de cada cláusula SELECT o tabla de operaciones.
  2. select_type: Indica qué tipo de SELECCIÓN, como SIMPLE (SELECCIÓN simple, no contiene subconsulta o UNION), PRIMARIO (SELECCIÓN más externa), SUBCONSULTA (subconsulta), etc.
  3. tabla: El nombre de la tabla de la operación.
  4. particiones: lista de particiones involucradas en la consulta.
  5. type: Indica el tipo de Join utilizado para ejecutar la consulta, como ALL, index, range, ref, eq_ref, etc.
  6. posibles_claves: una lista de índices que se pueden usar para la consulta.
  7. clave: El índice realmente utilizado.
  8. key_len: Indica la longitud del campo de índice.
  9. ref: Indica con qué campo o constante se compara el índice.
  10. filas: indica el número de filas de la tabla que deben escanearse.
  11. filtrado: Indica el porcentaje de filas filtradas respecto al número total de filas.
  12. Extra: Otra información, como el tipo de índice utilizado, si usar tablas temporales, si usar clasificación de archivos, etc.

4. Dispuestos en orden de grado de optimización de mejor a peor:

  1. system: Indica solo una fila de registros (por ejemplo SELECT ... FROM DUAL), que es el tipo de acceso más rápido.
  2. const: Indica una expresión constante que se puede encontrar indexando una vez. Por ejemplo, consultas de igualdad basadas en claves primarias o índices únicos.
  3. eq_ref: indica que se utiliza una unión equitativa y que, para cada valor de clave de índice, solo hay un registro coincidente en la tabla. Esto suele ocurrir cuando se une con una clave principal o un índice único.
  4. ref: indica que se usa un índice no único para una consulta equivalente o un índice único para una consulta de índice incompleta. Esto puede devolver varios registros coincidentes.
  5. range: Indica para obtener registros escaneando el rango del índice, como usar BETWEEN, INo algunos operadores aritméticos para consultar.
  6. index: indica un análisis de índice completo, que generalmente ocurre cuando no se usa ningún índice o el índice no se puede usar en la consulta.
  7. all: indica una exploración de tabla completa, que necesita recorrer toda la tabla para encontrar registros coincidentes, que es el tipo de acceso más lento.

Cinco, comando MOSTRAR ÍNDICE

  • Tabla: Indica el nombre de la tabla que se está consultando.
  • Non_unique: Indica si el índice permite valores duplicados, si es 0 significa un índice único, de lo contrario es un índice no único.
  • Key_name: Indica el nombre del índice.
  • Seq_in_index: Indica el orden en que aparece la columna de índice en el índice, contando desde 1.
  • Column_name: Indica el nombre de la columna de índice.
  • Intercalación: indica el juego de caracteres de la columna de índice.
  • Cardinalidad: Indica la cardinalidad de la columna del índice, es decir, el número de valores diferentes, cuanto mayor sea el valor, más útil será el índice.
  • Sub_part: indica la longitud de la subcadena de la columna de índice y su valor es nulo para las columnas de índice del tipo que no es una cadena.
  • Empaquetado: Indica el número de bytes ocupados por los tipos de datos utilizados por todas las columnas del índice. Cuanto menor sea el valor, más compacto será el índice.
  • Nulo: indica si se permite que la columna de índice sea nula.
  • Index_type: Indica el método de índice utilizado, como Btree, Hash, etc.
  • Comentario: Indica la información del comentario del índice.

6. Métodos de optimización comunes

1. Eliminar un solo índice y agregar un índice combinado

2. Modifique la función función_xx_mes para condiciones de tiempo de procesamiento [para el uso del procesamiento de funciones en consultas SQL]

3. Mejorar el conjunto de datos duplicados [para la duplicación y redundancia del conjunto de datos de Fanruan]

4. Cambie la subconsulta in a una conexión interna

5. Optimiza el grupo por campo

6. Habilite el almacenamiento en caché [Si SQL no se puede optimizar debido a los escenarios comerciales, puede habilitar el almacenamiento en caché de datos en el conjunto de datos de Fanruan, sacrificando el espacio del servidor a cambio del tiempo de ejecución de SQL]

7. Eliminación de atributos condicionales [Se debe considerar la optimización cuando hay muchos atributos condicionales, filtros, formularios y cálculos de fórmulas en los informes de Fanruan]

8. Elimine el índice [El índice excesivo también hará que la velocidad de consulta disminuya]

9. Cambie la palabra clave between y a >= <= [Esto es una cuestión de opinión, el SQL en algunos escenarios se ha acelerado significativamente en mi propia prueba, pero en la mayoría de los casos la aceleración no es obvia]

7. Resumen

La optimización SQL es un proceso de prueba y error constante. Al mismo tiempo, tendrá una comprensión diferente del estilo SQL de diferentes personas. Si puede entender lo que otros escribieron, cálmese y lea más, para que cuando lo escriba Si no entiendes el código SQL/de otras personas, cálmate y léelo despacio, ¡y solo escribe cuando lo entiendas! ánimo mutuo!

Supongo que te gusta

Origin blog.csdn.net/nanyangnongye/article/details/131692829
Recomendado
Clasificación