当前位置:网站首页>MYSQL Keyword Explain Analysis
MYSQL Keyword Explain Analysis
2022-08-01 01:10:00 【March is immortal】
Explain性能分析
Explain关键字可以模拟优化器执行SQL查询语句
EXPLAIN + SQL:
CREATE TABLE t1(id INT(10) AUTO_INCREMENT,content VARCHAR(100) NULL , PRIMARY KEY (id));
CREATE TABLE t2(id INT(10) AUTO_INCREMENT,content VARCHAR(100) NULL , PRIMARY KEY (id));
CREATE TABLE t3(id INT(10) AUTO_INCREMENT,content VARCHAR(100) NULL , PRIMARY KEY (id));
CREATE TABLE t4(id INT(10) AUTO_INCREMENT,content VARCHAR(100) NULL , PRIMARY KEY (id));
INSERT INTO t1(content) VALUES(CONCAT('t1_',FLOOR(1+RAND()*1000)));
INSERT INTO t2(content) VALUES(CONCAT('t2_',FLOOR(1+RAND()*1000)));
INSERT INTO t3(content) VALUES(CONCAT('t3_',FLOOR(1+RAND()*1000)));
INSERT INTO t4(content) VALUES(CONCAT('t4_',FLOOR(1+RAND()*1000)));
id:查询的序列号,The order in which the action sheet is loaded,id越大,越先执行
explain select t2.* from t1,t2,t3 where t1.id = t2.id and t2.id = t3.id;
EXPLAIN SELECT t1.`id`
FROM t1
WHERE t1.`id` IN (SELECT t2.`id`
FROM t2 WHERE t2.`id` IN (SELECT t3.`id`
FROM t3 WHERE t3.`content`=' '));
EXPLAIN SELECT t2.id FROM t2,(SELECT t3.id FROM t3) s1 WHERE s1.id = t2.`id`;
select_type: 代表查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询
select_type属性 | 含义 |
---|---|
SIMPLE | 简单的 select 查询,查询中不包含子查询或者 UNIO |
PRIMARY | 查询中若包含任何复杂的子部分,最外层查询则被标记为 Primary |
DERIVED | 在 FROM 列表中包含的子查询被标记为 DERIVED(衍生) ,MySQL 会递归执行这些子查询, 把结果放在临时表里. |
SUBQUERY | 在SELECT或WHERE列表中包含了子查询 |
DEPEDENT SUBQUER | 在SELECT或WHERE列表中包含了子查询,子查询基于外层 |
UNCACHEABLE SUBQUERY | 无法使用缓存的子查询 |
UNION | 若第二个SELECT出现在UNION之后,则被标记为UNION; 若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED |
UNION RESULT | 从UNION表获取结果的SELECT |
The following demonstrates a few less common ones
explain select t2.`id` from t2 where t2.`id` =
-> (select t3.`id` from t3 where t3.id= 1);
EXPLAIN SELECT t2.`id` FROM t2 WHERE t2.`id` IN
-> (SELECT t3.`id` FROM t3 WHERE t3.`content`= 'PfkHFe');
EXPLAIN SELECT * FROM t3 WHERE id = (SELECT id FROM t2 WHERE t2.`id`[email protected]@sort_buffer_size);
#UNION | UNIONRESULT
EXPLAIN SELECT t2.id,t2.`content` FROM t2
UNION ALL
SELECT t3.`id`,t3.`content`FROM t3;
table:Indicates which table this data is based on
type:
type 是查询的访问类型.是较为重要的一个指标,结果值从最好到最坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index>all
一般来说,得保证查询至少达到 range 级别,最好能达到 ref
type=system:表只有一行记录(等于系统表), const 类型的特列,平时不会出现
type=const:只匹配一行数据,通过索引一次就找到了,const 用于比较 primary key 或者 unique 索引.
EXPLAIN SELECT * FROM (SELECT * FROM t1 WHERE t1.`id` = 1) s;
eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配.常见于主键或唯一索引扫描
EXPLAIN SELECT * FROM t1,t2 WHERE t1.id = t2.id;
type=ref:非唯一性索引扫描,返回匹配某个单独值的所有行.本质上也是一种索引访问,它返回所有匹配某个单独值的行, 然而,它可能会找到多个符合条件的行,所以他应该属于查找和扫描的混合体.
EXPLAIN select * FROM t1,t2 WHERE t1.`content` = t2.`content`;
建立索引前:
建立索引后:
type=range:只检索给定范围的行,使用一个索引来选择行.key 列显示使用了哪个索引一般就是在你的 where 语句中出现 了 between、<、>、in 等的查询这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而 结束语另一点,不用扫描全部索引
EXPLAIN SELECT * FROM t1 WHERE t1.`id` < 10;
EXPLAIN SELECT * FROM t1 WHERE t1.`id` IN (1,7,8);
type=index:出现index是sql使用了索引但是没用通过索引进行过滤,一般是使用了覆盖索引或者是利用索引进行了排序分组.
type=all:遍历全表以找到匹配的行
type=index_merge:在查询过程中需要多个索引组合使用,通常出现在有 or 的关键字的 sql 中
explain select * from t2 where t2.content is null or t2.id=1;
type=ref_or_null:对于某个字段既需要关联条件,也需要 null 值得情况下.查询优化器会选择用 ref_or_null 连接查询
EXPLAIN SELECT * FROM t2 WHERE t2.`content`IS NULL OR t2.`content`='abc';
type=index_subquery:利用索引来关联子查询,不再全表扫描
EXPLAIN SELECT * FROM t2 WHERE t2.`content` IN (SELECT t3.`content` FROM t3);
unique_subquery:该联接类型类似于 index_subquery. 子查询中
possible_keys:显示可能应用在这张表中的索引,一个或多个.查询涉及到的字段上若存在索引,则该索引将被列出,但不一 定被查询实际使用
key:实际使用的索引,如果为null,则没有使用索引
key_len:The length of the index used in the query(字节数), key_len 字段能够帮你检查是否充分的 利用上了索引.ken_len 越长,说明索引使用的越充分.
key_len只计算where条件用到的索引长度,而排序和分组就算用到了索引,也不会计算到key_len中.如果是单列索引,那就整个索引长度算进去,如果是多列索引,那么查询不一定都能使用到所有的列,用多少算多少
计算:
列类型 | KEY_LEN | 备注 |
---|---|---|
id int | key_len = 4 +1 = 5 | 允许NULL,加1-bytes |
id int not null | key_len=4 | 不允许NULL |
user char(30) utf8 | key_len=30*3+1 | 允许NULL |
user varchar(30) not null utf8 | key_len=30*3+2 | 动态列类型,加2-bytes |
user varchar(30) utf8 | key_len=30*3+2+1 | 动态列类型,加2-bytes;允许NULL,在加1-bytes |
detail text(10) utf8 | key_len=30*3+2+1 | TEXT列截取部分,被视为动态列类型,加2-bytes,且允许NULL |
如何计算:
①先看索引上字段的类型+长度比如 int=4 ; varchar(20) =20 ; char(20) =20
②如果是 varchar 或者 char 这种字符串字段,视字符集要乘不同的值,比如 utf-8 要乘 3,GBK 要乘 2, ③varchar 这种动态字符串要加 2 个字节
④允许为空的字段要加 1 个字节
第一组:key_len=age 的字节长度+name 的字节长度=4+1 + ( 20*3+2)=5+62=67
第二组:key_len=age 的字节长度=4+1=5
ref:显示索引的哪一列被使用
rows:rows 列显示 MySQL 认为它执行查询时必须检查的行数.越少越好!
extra:其他额外信息
1)Using filesor:说明 mysql 会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取.MySQL 中无法利用索引 完成的排序操作称为“文件排序”.
出现 filesort 的情况
优化后,不再出现 filesort
查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
2)Using temporary:使用了临时表保存中间结果,MySQL 在对查询结果排序时使用临时表.常见于排序 order by 和分组查询 group by. 优化前:
优化后:
3)Using index:Using index 代表表示相应的 select 操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错! 如果同时出现 using where,表明索引被用来执行索引键值的查找;如果没有同时出现 using where,表明索引只是 用来读取数据而非利用索引执行查找.
利用索引进行了排序或分组
4)表明使用了 where 过
5)Using join buffer:使用了连接缓存
6)impossible where:where 子句的值总是 false,不能用来获取任何元素
7)7 select tables optimized away:在没有 GROUPBY 子句的情况下,基于索引优化 MIN/MAX 操作或者对于 MyISAM 存储引擎优化 COUNT(*)操 作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化. 在 innodb 中:
在Myisam中:
边栏推荐
- RTL8762DK 点灯/LED(三)
- leetcode:1648. 销售价值减少的颜色球【二分找边界】
- The principle of virtual inheritance
- Team of Professor Chen Jianyu of Tsinghua University | Contact Safety Reinforcement Learning Framework Based on Contact-rich Robot Operation
- Exam preparation plan
- MYSQL二阶段提交
- 2022年最新重庆建筑八大员(电气施工员)模拟题库及答案
- Key Points Estimation and Point Instance
- MYSQL索引解析
- Cmake introductory study notes
猜你喜欢
Rainbow share | how to use moving targets defense technology to guard against the unknown
In 2022, the latest eight Chongqing construction members (electrical construction workers) simulation question bank and answers
pycaret source code analysis: download dataset\Lib\site-packages\pycaret\datasets.py
Super like the keyboard made from zero, IT people love it
WeChat applet page syntax
SC7A20 (Silan Micro-Accelerometer) Example
北京突然宣布,元宇宙重大消息
RTL8762DK PWM(七)
清华大学陈建宇教授团队 | 基于接触丰富机器人操作的接触安全强化学习框架
Matlab / ArcGIS 处理GPM全球月均降水数据
随机推荐
Academicians of the two academies speak bluntly: Don't be superstitious about academicians
500 miles
LeetCode--The problem of robbery
MYSQL关键字Explain解析
Luogu P3373: Segment tree
Super like the keyboard made from zero, IT people love it
MYSQL经典面试题
By Value or By Reference
RTL8762DK Lighting/LED (3)
Rasa 3.x Study Series - Rasa - Issues 4918 Study Notes
Web3.0: Building an NFT Market (1)
LeetCode每日一练 —— 环形链表问题(面试四连问)
数据中台建设(七):数据资产管理
Application of integrated stepper motor in UAV automatic airport
Modern Enterprise Architecture Framework 1
sqlserver无法远程连接
类和对象:中
Item 36: Specify std::launch::async if asynchronicity is essential.
Likou Binary Tree
Rasa 3.x 学习系列-使用查找表改进实体提取