Escriba la experiencia de SQL, muchas lecciones extraídas aprendidas

Los siguientes son los problemas a los que se debe prestar atención en SQL, algunos son pozos en los que he pisado y otros son pisados ​​por colegas. Puede que no sientas nada cuando lo mires, pero lo recordarás cuando accidentalmente hagas un problema jajaja

seleccionar cláusula

(1) GROUP_CONCAT

Considere usar con cuidado

Este método consiste en agregar las mismas líneas en cadenas en forma de agrupación . Los caracteres están separados por comas de forma predeterminada , lo que lleva un poco de tiempo. Cuando lo use, considere la cantidad de líneas que se agregarán. Úselo con precaución si hay demasiadas líneas. Antes que un colega, SQL se agotó debido a esto

En cuanto a su utilidad, por ejemplo:

Todos los estudiantes de la escuela deben dividirse en clases.

select class as 班级 , GROUP_CONCAT(studentName) as 学生名单 from student group by class
clase Lista de estudiantes
Clase 1 Xiao Ming, Xiao Bai, Xiao Huang
Clase 2 Cerdito, Ergouzi

(2) Consulta

No sé cómo llamarlo, y nunca había visto a nadie escribirlo así antes, se ve así:

select studentName as 学生姓名, (select grade from student_grade where class = '1班') as 成绩 from student_info where class = '1班'  

Suponga que hay 50 personas en la clase 1

Según el orden de ejecución de SQL: primero desde -> donde -> seleccionar , cada vez que verificamos el nombre de un compañero, verificamos la calificación de toda la clase (es decir, la calificación de selección se ejecuta una vez);

En una palabra, cuántas filas devuelve el SQL de la consulta externa (50 nombres de estudiantes en total 50 filas), la consulta interna verificará unas cuantas veces y un total de 50 verificaciones más, si la consulta externa devuelve 500.000 filas.

Se recomienda utilizar menos consultas internas.


de la cláusula

(1) Únase intente no conectar tablas con una gran cantidad de datos

Join necesita usar memoria de tabla temporal y generará una tabla temporal. Para tablas grandes con millones de datos, use Tienes que tener cuidado con la unión a la izquierda Hasta:

Demostración de error:

select .. from 600万行的表  left join 1000行的表  on ...

Para una combinación a la izquierda, no importa cuáles sean las condiciones detrás de, se generará una tabla temporal de 6 millones de filas y la memoria de la tabla temporal de su base de datos explotará.

Debido a que la combinación de la izquierda hace que la tabla grande de la izquierda sea escaneada casi por toda la tabla, es probable que el índice no tenga efecto.

left join + where significa que después de que se genera la tabla temporal, la tabla temporal se filtra y se elimina con las condiciones de where


La cláusula where debe garantizar que el índice no falle.

(1) Operación de columna de índice

Demostración de error:

# (1) DATE_FORMAT会导致日期索引失效,假设create_time是索引
select record_info as 日志内容 from record_log where  DATE_FORMAT(create_time,'%Y-%m-%d')='2021-02-23'

# (2) age是int 型, 且作为索引列, 参与了算术运算, 导致索引失效
'age' int(11) Not NULL DEFAULT 0 COMMENT '年龄'
select studentName as 学生姓名 from student_info where age+1 = 18

El DATE_FORMAT del primer SQL hará que el índice de fecha no sea válido, porque la base de datos calculará el create_time fila por fila antes de compararlo, que es básicamente un escaneo completo de la tabla.

El segundo SQL realiza operaciones en la edad de la columna de índice, lo que hará que el índice falle.

(2) Evite la conversión automática de tipos de datos

Qué tipo de campos hay en la tabla y qué tipo de parámetros se pasan

Demostración de error:

# age是字符型, 且为索引
'age' varchar(6) Not NULL DEFAULT '0' COMMENT '年龄'

alter table student_info add index index_age('age')

select studentName as 学生姓名 from student_info where age = 18

edad como columna de índice

  • La definición de la tabla es la edad del personaje: 18 pasará el tipo int índice de falla , la hoja de datos de edad en el caso de "18.0", "18" en ambos casos puede llevar a que la edad se convierta en una fila int después de Comparar con 18

(3) Traiga la clave de la sub-biblioteca

Si la base de datos del proyecto tiene sub-bases de datos y sub-tablas, intente traer la clave de la sub-base de datos al realizar la consulta . Puede distribuir sentencias SQL a las tablas de la base de datos especificada para su ejecución. Nuestro DRDS es así

Si no hay una clave de subbase de datos (clave dividida), hará que la declaración SQL se escanee y se ejecute en toda la base de datos, lo cual es muy lento.


(4) El orden del índice compuesto

创建复合索引
alter table student_info add index index_collection('age','studentName','sex')

Solo el orden de las siguientes tres declaraciones donde seguirá el índice compuesto:

  • edad, nombre del estudiante, sexo
  • edad, nombre del estudiante
  • edad

Además, la edad de la primera columna del índice incluye ">, <, entre y" , por lo que el índice está deshabilitado.

Porque cuando se trata de consultas de rango , la búsqueda de índice del árbol B + es" Recorre la lista vinculada de nodos hoja directamente de izquierda a derecha ", En lugar de mirar hacia arriba desde el nodo raíz de arriba a abajo


agrupar y ordenar por son rápidos con índice

Los índices detrás de agrupar por y ordenar por pueden reducir la sobrecarga


Definición de estructura de tabla

(1) Menos NULL predeterminado

Especialmente si la definición de la columna de índice es NULL predeterminada, afectará en gran medida la estabilidad

La definición de la columna es mejor tener un valor predeterminado, es decir, NO VALOR PREDETERMINADO NULO


(2) La definición del campo da un comentario COMENTARIO

En particular, muestra el estado del tipo de campo, y los valores se dan a todos los estados correspondientes al significado, por ejemplo:

`state` int(11) NOT NULL DEFAULT 0  COMMENT'0 进行中,  1 完成,   2 失效'

(3) Menor uso del tipo de texto

El texto es un tipo de datos de texto largo. El servidor MySQL consume una gran cantidad de ancho de banda de red para enviar datos de texto de vuelta al cliente , durante la carga de los datos de texto desde el disco a la memoria cuando las consultas de servidor requiere una gran cantidad de ancho de banda IO .

Por lo tanto, al definir el tipo de datos de un campo, el texto generalmente solo se usa cuando no se puede determinar la longitud de los datos , y se usa con precaución en otras situaciones.


Configuración de índice

(1) El índice tiene un alto grado de discriminación.

¿Qué es un alto grado de discriminación? Es decir, es mejor que los valores de campo de las columnas de índice sean diferentes, cuanto menor sea la repetición, mayor será el grado de discriminación . La clave principal es la más distinguible. Cada fila es un valor único. El árbol B + puede dividir fácilmente todas las filas.

El tipo de índice de discriminación bajo en la columna es mejor que no , como género sexo, nada más que hombre o mujer, habrá muchas filas de datos duplicadas, imagina:

Si quieres saber quiénes son los chicos con puntuaciones superiores a 90, hay 50 personas en total y 49 chicos ...

在成绩表grade 将性别sex设置为索引
alter table grade add index index_sex('sex')

select studentName from grade where sex='男' and grade>90 

La implementación esperada es sacar 49 chicos y comparar los resultados uno a uno, que es casi lo mismo que si no hubiera índice ...

Debido a que la frecuencia de index sex = 'male' es demasiado alta, se estima que la estrategia de ejecución de MySQL se convertirá en un escaneo completo de la tabla.

Sin embargo, nuestra empresa tiene tal problema, no nos atrevemos a decir nada. . .


(2) Es mejor que la longitud de los datos del campo de índice sea menor

El nodo del árbol B + necesita almacenar todos los valores de la columna de índice. Si cada valor de la columna de índice es muy grande, MySQL consumirá mucho ancho de banda IO en el proceso de carga del índice en la memoria.

Además, si la longitud de los datos del campo de índice es pequeña, la memoria ocupada es pequeña.Como sabes, el espacio del índice de caché establecido por innodb_buffer_pool_size es limitado. Cuanto menor sea la longitud de los datos del campo de índice, más valores clave puede contener la memoria, lo que aumenta la probabilidad de que el valor objetivo se pueda encontrar de una vez. Una vez que no pueda encontrarlo, debe cargar otros índices desde el disco para verificar

Puede usar el tipo int, intente no usar BigInt

La clave principal debe reducir la longitud de los datos . Cada índice secundario (excepto el índice del índice agrupado) almacenará el campo de índice (otros campos excepto la clave principal) + la clave principal correspondiente . Si la clave principal es demasiado larga, entonces cada índice secundario Cuanto más memoria ocupa


No conozco a los demás, no puedo escribir. . .

Supongo que te gusta

Origin blog.csdn.net/qq_44384533/article/details/113941577
Recomendado
Clasificación