Mysql优化之执行计划查看

我们经常说到mysql优化,优化中一种常见的方式就是对于经常查询的字段创建索引。那么mysql中有哪些索引类型呢?

一、索引分类
1、普通索引:即一个索引只包含单个列,一个表可以有多个单列索引

2、唯一索引:索引列的值必须唯一,但允许有空值

3、复合索引:即一个索引包含多个列

4、聚簇索引(聚集索引):并不是一种单独的索引类型,而是一种数据存储方式。具体细节取决于不同的实现,InnoDB的聚簇索引其实就是在同一个结构中保存了B-Tree索引(技术上来说是B+Tree)和数据行。

5、非聚簇索引:不是聚簇索引,就是非聚簇索引

二、基本语法

查看索引
SHOW INDEX FROM table_name

创建索引
CREATE [UNIQUE ] INDEX indexName ON mytable(columnname(length));
ALTER TABLE 表名 ADD [UNIQUE ] INDEX [indexName] ON (columnname(length))

删除索引
DROP INDEX [indexName] ON mytable;

上面讲了创建索引的基本语法,现在处理讲一下如何查看执行计划。

执行计划:使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈

执行计划的作用:1、表的读取顺序,2、数据读取操作的操作类型/   3、哪些索引可以使用,哪些索引被实际使用    4、表之间的引用    5 、每张表有多少行被优化器查询

执行计划包含的信息有:

执行计划-ID

select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序

有三种情况:
(1)、id相同,执行顺序由上至下
(2)、id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
(3)、id相同不同,同时存在

执行计划-select_type:查询的类型,主要是用于区别,普通查询、联合查询、子查询等的复杂查询

执行计划-type
type显示的是访问类型,是较为重要的一个指标,结果值从最好到最坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

常见的为: system>const>eq_ref>ref>range>index>ALL

system:表只有一行记录(等于系统表),这是const类型的特列,平时不会出现,这个也可以忽略不计

const:表示通过索引一次就找到了,const用于比较primary key或者unique索引。因为只匹配一行数据,所以很快如将主键置于where列表中,MySQL就能将该查询转换为一个常量

eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描

range:只检索给定范围的行,使用一个索引来选择行。key 列显示使用了哪个索引,一般就是在你的where语句中出现了between、<、>、in等的查询
              这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。

all:Full Table Scan,将遍历全表以找到匹配的行

执行计划-possible_keys : 实际使用的索引。如果为NULL,则没有使用索引,查询中若使用了覆盖索引,则该索引和查询的select字段重叠

执行计划-key_len :表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好
                              key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的

根据这个值,就可以判断索引使用情况,特别是在组合索引的时候,判断所有的索引字段是否都被查询用到。
                              char和varchar跟字符编码也有密切的联系,
                              latin1占用1个字节,gbk占用2个字节,utf8占用3个字节。(不同字符编码占用的存储空间不同)

字符类型:索引字段为char + 不为 null:

字符类型:索引字段为char + 允许为 null:

索引字段为varchar类型+不可为Null时:

索引字段为varchar类型+允许为Null时:

整数/浮点数/时间类型的索引长度 :NOT NULL=字段本身的字段长度,NULL=字段本身的字段长度+1(因为需要有是否为空的标记,这个标记需要占用1个字节)
                                                       datetime类型在5.6中字段长度是5个字节,datetime类型在5.5中字段长度是8个字节

key_len 总结:
变长字段需要额外的2个字节(VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节),所以VARCAHR索引长度计算时候要加2),固定长度字段不需要额外的字节。
而NULL都需要1个字节的额外空间,所以索引字段最好不要为NULL,因为NULL让统计更加复杂并且需要额外的存储空间。
复合索引有最左前缀的特性,如果复合索引能全部使用上,则是复合索引字段的索引长度之和,这也可以用来判定复合索引是否部分使用,还是全部使用。

执行计划-ref : 显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值

执行计划-rows:根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数

执行计划-Extra:包含不适合在其他列中显示但十分重要的额外信息

Using filesort 说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为“文件排序”
Using temporary:使了用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序 order by 和分组查询 group by

USING index :表示相应的select操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错,如果同时出现using where,表明索引被用来执行索引键值的查找,
如果没有同时出现using where,表明索引用来读取数据而非执行查找动作

    

原文地址:https://www.cnblogs.com/cheng21553516/p/11403378.html

时间: 2024-10-11 19:06:02

Mysql优化之执行计划查看的相关文章

MySQL索引及执行计划

MySQL索引及执行计划 索引 合理的建立索引可以加快数据查询,例如,学校图书管为每一本书编号,根据编号可以快速锁定一本书所在位置.MySQL索引默认B+树索引.索引虽然能够提高检索效率,但同时也会降低更新的速度,因为insert .update.delete也会操作索引文件,会调整因为更新等操作带来的键值变化后的索引信息. 索引类型 主键索引:唯一索引,并且并指定为primary key,每个表中只能有一个主键 唯一索引:索引列的所有值都只能出现一次,即值必须唯一,值可以为空 普通索引:基本的

Oracle性能优化之执行计划管理_超越OCP精通Oracle视频教程培训31

Oracle性能优化之执行计划管理_超越OCP精通Oracle视频教程培训31 本课程介绍: Oracle视频教程,风哥本套oracle教程培训<<Oracle数据库性能优化培训教程>>的第1/10套:Oracle性能优化之执行计划管理.主要学习Oracle性能优化简介,SQL 语句处理流程,软解析和硬解析,绑定变量及案例,游标的介绍,Oracle的优化器,执行计划的查看,SQL语句访问路径,SQL语句的连接方式,Oracle驱动表,执行计划的干预,常用hint提示的使用. 视频教

最全的display_cursor执行计划查看使用方法

1.解释并查看sql文本的执行计划 explain plan for select 3+5 from dual; select * from table(dbms_xplan.display()); select * from table(dbms_xplan.display(table_name=>'PLAN_TABLE',statement_id=>null,format=>'ALL')); 用explain plan解释一个SQL,相关信息会默认被放到一个一个叫PLAN_TABLE

正确使用索引(sql优化),limit分页优化,执行计划,慢日志查询

查看表相关命令 - 查看表结构   desc 表名- 查看生成表的SQL   show create table 表名- 查看索引   show index from  表名 使用索引和不使用索引 由于索引是专门用于加速搜索而生,所以加上索引之后,查询效率会快到飞起来. # 有索引 mysql> select * from tb1 where name = 'zhangqiye'; +-----+-------------+---------------------+--------------

数据库-Oracle通过执行计划查看查询语句是否使用索引【转】

1.生成执行计划 explain plan for select * from t_call_records where t_bjhm='123456' 备注:explain plan for后面为要生成执行计划的查询语句 2.查看执行计划结果 select * from table(dbms_xplan.display) 如上图所示,TABLE ACCESS FULL为全表扫描; 为t_bjhm列加上索引后生成执行计划并查看结果: 如上图所示,index range scan为索引范围扫描;

oracle里的执行计划-查看

内容主要来自看书学习的笔记,如下记录了常见查询执行计划的方法. 2.2 如何查看执行计划1.explain plan2.dbms_xplan包3.autotrace4.10046事件5.10053事件6.awr/statspack报告(@?/rdbms/admin/awrsqrpt)7.脚本(display_cursor_9i.sql) 2.2.1 explain planexplain plan for sqlselect * from table(dbms_xplan.display);SQ

mysql的sql执行计划详解

实际项目开发中,由于我们不知道实际查询的时候数据库里发生了什么事情,数据库软件是怎样扫描表.怎样使用索引的,因此,我们能感知到的就只有 sql语句运行的时间,在数据规模不大时,查询是瞬间的,因此,在写sql语句的时候就很少考虑到性能的问题.但是当数据规模增大,如千万.亿的时候,我们运 行同样的sql语句时却发现迟迟没有结果,这个时候才知道数据规模已经限制了我们查询的速度.所以,查询优化和索引也就显得很重要了. 问题: 当我们在查询前能否预先估计查询究竟要涉及多少行.使用哪些索引.运行时间呢?答案

MySQL索引管理及执行计划

第1章 索引介绍: 索引是对数据库表中一列或者多了的值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息,如果想按特定职员的姓名来查找,则与他在表中搜索所有的行相比,索引有助于更快的获取信息 索引的一个主要目的就是加快检索表中的数据的方法,既能协助信息搜索者尽快找到符合限制条件的记录ID的辅助数据结构 1.1 索引的类型介绍: btree:B+树索引    最为常用 hash:hash索引 fulltest:全文索引 rtree:r数索引 第2章 索引管理 2.1 B树索引的分类: 主

查看执行计划

1.工具介绍 总结:单纯估算用autotrace,真实调优用DBMS_XPLAN带参数 1.explain 因为绑定变量的原因,这个只能是估算 explain plan for select 3+5 from dual; select * from table(dbms_xplan.display()); select * from table(dbms_xplan.display(table_name=>'PLAN_TABLE',statement_id=>null,format=>'