我们经常说到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

Mysql优化之执行计划查看相关推荐

  1. MySQL优化从执行计划开始(explain超详细)

    前言 小伙伴一定遇到过这样反馈:这页面加载数据太慢啦,甚至有的超时了,用户体验极差,需要赶紧优化: 反馈等同于投诉啊,多有几次,估计领导要找你谈话啦. 于是不得不停下手里头的活,赶紧进行排查,最终可能 ...

  2. MySQL 优化 —— EXPLAIN 执行计划详解

    引言 本博客大部分内容翻译自MySQL 官网 Understanding the Query Execution Plan 专题.另外有一些补充,则来自于网课以及<高性能MySQL(第三版)&g ...

  3. 超硬核!MySQL优化从执行计划开始(explain超详细)

    前言 小伙伴一定遇到过这样反馈:这页面加载数据太慢啦,甚至有的超时了,用户体验极差,需要赶紧优化: 反馈等同于投诉啊,多有几次,估计领导要找你谈话啦. 于是不得不停下手里头的活,赶紧进行排查,最终可能 ...

  4. error40无法打开到sql_技术分享|初识SQL优化之执行计划查看分析

    董  俊 合肥科技研发中心 一 为什么要进行SQL优化 应用程序运行缓慢的原因通常分为两个方面:源代码和SQL语句.对应用程序的优化也通常针对源代码和SQL语句.源代码的优化,一方面可能会涉及对程序逻 ...

  5. MySQL性能优化-根据执行计划进行性能优化

    2019独角兽企业重金招聘Python工程师标准>>> 1. 使用执行计划explain命令分析 在要运行的sql前面加上explain就可以得到执行计划如下表: 在explain后 ...

  6. MySQL性能分析工具的使用:慢查询日志、EXPLAN的使用、分析优化器执行计划:trace、MySQL监控分析视图-sys schema

    文章目录 1.数据库服务器的优化步骤 2.查看系统性能参数 2.1 语法 2.2 常用参数 3.统计SQL的查询成本:last_query_cost 4.定位执行慢的SQL:慢查询日志 4.1 慢查询 ...

  7. MySQL——EXPLAIN和执行计划

    EXPLAIN MySQL 里提供一个解释命令EXPLAIN.EXPLAIN的用法有两种,分别是: 1.解释表结构,等同于DESCRIBE,语法:  EXPLAIN table_name;  2.解释 ...

  8. MySQL中的执行计划

    MySQL中的执行计划 在MySQL中可以通过explain关键字模拟优化器执行SQL语句,从而知道MySQL是如何处理SQL语句的: 一.Mysql整个查询执行过程 客户端向MySQL服务器发送一 ...

  9. mysql 执行计划不对_关于mysql主从查询执行计划不一致问题的分析

    最近面试过程中被面试官抛了一个问题,说曾经有一个线上出现的奇怪的问题,主库和从库各种配置是一致的,当数据量比较大的时候,某些时候同样的查询,在从库里的执行计划执行成功了,而主库里没有执行这个执行计划, ...

最新文章

  1. php 获取权限,php 获取权限列表函数_PHP教程
  2. 已经围上为何不算目_在湖人打球顺风顺水,戴维斯为何还要亏本卖掉洛杉矶豪宅?...
  3. Delphi读取文本内容
  4. Ubuntu kylin 14.04 LTS上安装opencv
  5. nssl1468-V【状压,数学期望,dfs】
  6. 使用.NET Remoting开发分布式应用——基于租约的生存期(转载)
  7. 计算机科学和软件工程区别,计算机科学和软件工程的区别
  8. ssis 计划任务_SSIS FTP任务概述
  9. 从对工作流理论发展的理解到jBPM4的设计思想
  10. 《Core Data应用开发实践指南》一2.15 小结
  11. RDKit入门教程(1)——RDKit 安装 (Win10)
  12. 百度网盘加速下载Motrix多线程下载器
  13. Unity中世界坐标与相对于某个物体的相对坐标的转换
  14. 服务器amd cpu性能排行,2018年PC处理器性能排行:英特尔9代酷睿被AMD反超!
  15. 数据挖掘常用算法整理
  16. 机会总是留给有准备的人 —— 从裁缝到码农
  17. 支付宝生活号h5网页--蚂蚁认证
  18. 10.Go复合类型-切片
  19. 最大字数组求和改进!
  20. SSH命令行使用方法

热门文章

  1. MORMOT数据库连接池
  2. 【MySQL】PREPARE 的应用
  3. pfsense 2.2RC版本应用
  4. SharePoint GridView的使用2——DataSourceView的使用
  5. java版开源工作流引擎ccflow从表数据数据源导入设置
  6. 35.6. /etc/dnsmasq.d/dnsmasq.address.conf
  7. iOS 数据持久化-- FMDB
  8. Oracle执行计划解释
  9. jenkins 配置
  10. [原]小命令大作用:modprobe