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;
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
-
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;
-
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
-
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
-
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 )
-
El resultado de UNION RESULT UNION es que el resultado se consulta directamente al resultado sin ID id = NULLexplain select * from user union select * from user_2 -- 一个 PRIMARY 一个UNION 一个UNION RESULT
-
Subconsultas en la lista SUBQUERY
select o whereEXPLAIN SELECT AGE FROM test WHERE AGE > (select age from test);
-
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 externoexplain select * from user a where a.age not in (select age from user_2 b where b.age > a.age )
-
DERIVADOS
tabla derivada
explain select *from (select * from user where age>10) a
- SUBQUERÍA INACTIVABLE
no almacena en caché la subconsulta la subconsulta usa una función aleatoriaexplain select * from user where age > (select max(age) from user_2 where age >rand() )
- 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
-- 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.