Notas personales de optimización MySQL (explicar el plan de ejecución) No molestar -m09

Plan de ejecucion

Utilice el optimizador de simulación explica + sql para ejecutar la declaración de consulta SQL
dirección del sitio web oficial

-- 2中方式
explain select * from test;
explain extended select * from test;

Inserte la descripción de la imagen aquí

carné de identidad

El número de secuencia de la consulta de selección indica el orden en que se ejecuta la instrucción de selección o la tabla de operaciones en la consulta
1. La selección con la identificación más grande se ejecuta primero
2. Si el tamaño de la identificación es el mismo, se ejecuta en orden de arriba a abajo

seleccione tipo

  1. La consulta más simple de SIMPLE 1. Sin unión 2. Sin subconsulta

    DROP TABLE IF EXISTS `user`;
    CREATE TABLE `user` (
      `ID` int(11) NOT NULL,
      `U_NAME` varchar(255) DEFAULT NULL,
      `AGE` int(11) DEFAULT NULL,
      `ADDRESS` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    -- 给表搞点儿数据 
    INSERT INTO `user` VALUES ('322', 'test', '12', '北京');
    ... 
    ...
    我插入了500多条 ..
    -- 执行 
    explain select * from user;
    
  2. Si la consulta PRIMARIA contiene alguna subconsulta compleja (la unión también se cuenta), la consulta más externa se llama Primaria

    explain select * from user 
    where  age = (select max(age) from user)
     -- 第一个select(外层查询)就被称之为 PRIMARY 
    
  3. UNION se marca como union si la segunda selección aparece después de union

    explain select u_name  from user union select u_name from user  
    --  第二个select(union后的select)就会被标记位union 
    
  4. UNIÓN DEPENDIENTE primero si la unión el segundo resultado de la unión interna depende de las condiciones de la consulta externa

    DROP TABLE IF EXISTS `user_2`;
    CREATE TABLE `user_2` (
      `ID` int(11) NOT NULL,
      `U_NAME` varchar(255) DEFAULT NULL,
      `AGE` int(11) DEFAULT NULL,
      `ADDRESS` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    
    DROP TABLE IF EXISTS `user_3`;
    CREATE TABLE `user_3` (
      `ID` int(11) NOT NULL,
      `U_NAME` varchar(255) DEFAULT NULL,
      `AGE` int(11) DEFAULT NULL,
      `ADDRESS` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    -- user_2  user_3 搞点儿数据 直接把user表数据搞过去也行 
    
    explain  select * from user a where a.age in(
    	select age from user_2  union select age from user_3
    )
    

    Parece que ... el resultado de la unión interna no depende de las condiciones externas,
    pero ... la declaración anterior se optimizará

    	  select * from user a  where EXISTS
    			 (select age from user_2 where user_2.age =a.age
    			  union select age from user_3 where user_3.age = a.age )
    

    Inserte la descripción de la imagen aquí


  5. El resultado de UNION RESULT UNION es que el resultado se consulta directamente al resultado sin ID id = NULL

     explain  select * from user union select * from user_2 
    -- 一个 PRIMARY  一个UNION  一个UNION RESULT 
    

    Inserte la descripción de la imagen aquí

  6. Subconsultas en la lista SUBQUERY
    select o where

    EXPLAIN SELECT AGE FROM test
     WHERE AGE > (select age from test);
    

    Inserte la descripción de la imagen aquí

  7. La SUBQUERÍA DE DEPENDENCIA
    primero es una SUBQUERÍA. El
    segundo resultado de la subconsulta está sujeto a influencia externa. En el
    ejemplo, el resultado de la subconsulta se ve afectado por el a.age externo

     explain  select * from  user a where  a.age
      not  in  (select  age from user_2 b where  b.age > a.age )
    

    Inserte la descripción de la imagen aquí

  8. DERIVADOS
    tabla derivada

explain  select *from (select * from user where age>10) a

Inserte la descripción de la imagen aquí

  1. SUBQUERÍA INACTIVABLE
    no almacena en caché la subconsulta la subconsulta usa una función aleatoria
    explain select * from user where age > (select max(age) from user_2 where age >rand() )
    
    Inserte la descripción de la imagen aquí
  2. UNIÓN INACTIVABLE
    Unión que no se puede almacenar en caché
    模拟不出来 
    

Poco conocimiento

select @@autocommit;
select @@sort_buffer_size; 
查询当前系统参数内容

mesa

Corresponde a la tabla a la que se accede, el nombre o el alias de la tabla o Union <n, m> o tabla temporal

  • El alias de nombre de tabla específico va directamente a la tabla física para obtener datos
  • El nombre de la tabla es derivado X, lo que significa que la tabla derivada generada por la consulta con id X
  • Cuando el resultado de la Unión, el nombre de la tabla tiene la forma de unión n1, n2, etc., n1, n2 representa la identificación de participar en la unión

framework de código abierto Apache calcita resolver el sql dirección

particiones

Partición

tipo

Tipo Muestra el tipo de acceso, tipo de acceso representa es qué clase de una forma de acceder a los datos
tienen alguna pregunta Dime qué red
https://dev.mysql.com/doc/refman/8.0/en/explain-output.html
más propensos a pensar Es un escaneo completo de la tabla (atraviesa toda la tabla directamente)

Mejor a peor rendimiento:
Sistema -> const -> eq_ref -> REF -> FULLTEXT -> ref_or_null
-> index_merge -> unique_subquery -> index_subquery
-> gama -> ALL
en general para asegurar que al menos alcanzar el mejor rango de nivel Alcanzó el nivel de referencia

-- ALL  全表扫描 需要优化
explain select * from user;
-- index 
1. 查询覆盖索引,既我们需要的数据 在索引中可以获取
explain select id(主键) from user;
2. 使用了索引进行排序 这样就能避免数据的重排序
explain select * from user order by id(索引列)explain select * from user order by age(非索引列)  慢
-- range 
表示利用索引查找时 限制了范围 避免了index全表扫描 
适合的操作:
-- <>,>,>=,<,<=,IS NULL,BETWEEN ,LIKE ,IN,NOT IN
-- 给用户表的age 加一个索引 
ALTER TABLE `user`
ADD INDEX `idx_age` (`AGE`) USING BTREE ;

explain SELECT * FROM user WHERE age  > 18
-- index_subquery  模拟不出来
利用索引来关联子查询 不再全表扫描  aa是 t2表的索引列  
有时候会被优化为exists 效果不一定能出来
explain select * from user where `user`.age in (select age from user_2);
-- unique_subquery  与 index_subquery 类似  使用的是唯一索引  模拟不出来
explain select * from user where `user`.id in (select id from user_2);
-- index_merge    2个条件的结果合并
-- 前提条件是 age=18就几条 不能太多 太多就变成全表扫描了
explain SELECT * FROM user
  WHERE id(主键) = 10 or  age(索引)=18
 
-- ref_not_null    
对于某个条件 需要关联条件,也需要null值的情况下,查询优化器会选择这种方式访问

-- 先把user表的age字段搞几个位null的 
explain select * from user where age=18 or age is null 
-- ref
使用了非唯一性索引进行查找
explain select * from user where  age(普通索引) = 19
-- eq_ref 
使用唯一性索引进行查找 
explain select `user`.id from user where `user`.id=31 
这个是唯一性索引 查询出来就一条值  所以他就变成了const  不是eq_ref

所以这样:
explain select `user`.id from user ,user_2 where `user`.id = user_2.id 

Inserte la descripción de la imagen aquí

-- const
这个表至多有一个匹配 
select * from user where id(主键) = 100
-- system
表只有一行记录 (等于系统表) 是const类型的特例 平时不会出现
-- 



--  

posibles_claves

  • Mostrar los índices que se pueden aplicar en esta tabla, uno o más
  • Si hay un índice en el campo involucrado en la consulta, el índice aparecerá en la lista
  • Pero no necesariamente usado

llave

  • El índice real utilizado. Si es nulo, no se utiliza ningún índice.
  • Si se utiliza un índice de cobertura en la consulta, el índice y el campo de selección de la consulta se superponen

key_len

  • Representa los bytes utilizados en el índice.
  • Key_len puede calcular la longitud del índice utilizado en la consulta. Cuanto más corta sea la longitud sin perder precisión, mejor

árbitro

  • Se utiliza la columna que muestra el índice.
  • Si es posible, es una constante constante (la columna de índice tiene un valor constante id = 100)

filas

  • Estime aproximadamente el número de líneas a leer para encontrar el registro
  • Refleja directamente cuántos datos encuentra sql, por supuesto, cuanto menos mejor

extra

Contiene información adicional.

  • El uso de ordenar archivos
    significa que mysql no puede usar el índice para ordenar y solo puede usar el algoritmo de ordenación para ordenar, que consume recursos adicionales
  • Usando temporal para
    crear una tabla temporal para almacenar resultados intermedios, elimine la tabla temporal después de completar la consulta
  • El uso del índice
    indica que la consulta actual está cubriendo el índice y está leyendo datos directamente del índice sin acceder a la tabla de datos.
    Si usa where aparece al mismo tiempo, el índice se usa para realizar la búsqueda del valor de la clave del índice. Si no hay una descripción, el índice se usa para leer Datos, y realmente no encontré
  • utilizando where
    para el filtrado de datos

  • ya sea usando el búfer de unión
  • imposible donde el
    resultado de la declaración siempre es falso

Hay algunas simulaciones que desafortunadamente son desafortunadas. Alguien acaba de dar un ejemplo.

Publicados 432 artículos originales · ganado elogios 91 · Vistas de 250.000 +

Supongo que te gusta

Origin blog.csdn.net/qq_36291682/article/details/105620271
Recomendado
Clasificación