MySQL索引及执行计划

MySQL索引及执行计划

索引

合理的建立索引可以加快数据查询,例如,学校图书管为每一本书编号,根据编号可以快速锁定一本书所在位置。MySQL索引默认B+树索引。索引虽然能够提高检索效率,但同时也会降低更新的速度,因为insert 、update、delete也会操作索引文件,会调整因为更新等操作带来的键值变化后的索引信息。

索引类型

  • 主键索引:唯一索引,并且并指定为primary key,每个表中只能有一个主键
  • 唯一索引:索引列的所有值都只能出现一次,即值必须唯一,值可以为空
  • 普通索引:基本的索引类型,值可以为空,没有唯一性限制
  • 复合索引:一个索引中包含多个列

何时建立索引

  • 主键自动创建唯一索引
  • 频繁作为查询条件的字段适合创建索引
  • 查询中与其他表关联的字段适合创建索引
  • 频繁更新的字段不适合创建索引,因为在更新记录的同时会更新索引
  • where条件中使用不到的字段不需要创建索引
  • 在高并发下,在单值索引和复合索引中,复合索引更合适
  • order by字段添加索引可以提高排序速度

不需要索引

  • 表记录较少
  • 经常增删改的表
  • 数据重复且分布平均的表,如性别

执行计划

可以使用explain 关键字模拟优化器执行sql查询语句,从而分析查询语句或者表结构的性能瓶颈。

通过查看执行计划,可以了解到表的读取顺序、数据读取操作、哪些索引可以使用、哪些索引被实际使用、表之间的引用、每张表中有多少行被优化器查询

explain select * from tz_order a left join tz_order_item b on b.order_number = a.order_number where b.order_number = 1146347329394184192
id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE b ALL order_number 7 14.29 Using where
1 SIMPLE a eq_ref order_number_unique_ind order_number_unique_ind 152 yami_shops.b.order_number 1 100

id

表示实际操作中加载表的顺序,可以相同也可以不相同,如果id相同则从上往下依次加载执行,不相同则id越大对应的表越先加载。

select_type

  • SIMPLE:简单的select查询,查询中不包含子查询或者union
  • PRIMARY:查询中若包含任何复杂的子查询,最外层的最后加载的标记为此
  • SUBQUERY:在select或者where中包含子查询
  • DERIVED:在from列表中包含的子查询被标记为Derived(衍生),mysql会递归执行这些子查询,把结果放到临时表中
  • UNION:若第二个select出现在union之后,则被标记为union;若union包含在from子句的子查询中,外层的select为标记为derived
  • UNION RESULT:从union表中获取结果的select

type

  • System:表中只有一条记录
  • Const:表示通过索引一次就可以找到,用于主键索引或者唯一索引。因为只需要匹配一行,查询速度往往很快,mysql可以将该查询转换成一个常量
  • Eq_ref:唯一索引扫描,对于每个索引键,表中只有一条记录与之匹配,用于主键索引或者唯一索引
  • Ref:非唯一索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,返回所有匹配某个单独值的行,可能找到多行。
  • Rang:只检索给定范围的行,使用一个索引来选择行,一般where中使用了<、>、in、between这种范围扫描。
  • Index:index只遍历所引树,因为索引文件比数据文件小,所以读取索引文件比读全表快。
  • All:全表扫描,从硬盘读取

possible_key

可能应用到这张表的索引,查询涉及到的字段上若存在索引,则列出,但是不一定会使用。

key

实际使用到的索引,如果是null,则没有使用索引,如果查询中使用了覆盖索引,则该索引仅会出现在key列表中

key_len

表示索引中使用的字节数,计算查询中索引的长度,在不损失精度的情况下,越小越好,这个值显示的是索引字段的最大可能长度,不是实际长度

ref

显示索引的哪一列被使用

rows

根据表统计信息以及索引选用情况,大致估算找到所需记录需要扫描的行数

extra

  • Using filesort:mysql会对数据使用一个外部索引排序,而不是按照表内的索引进行读取,mysql中无法利用索引完成的排序操作叫做文件排序
  • Using temporary:使用了临时表保存中结果,mysql对查询结果排序使用了临时表。一般来说,是因为order by排序或者分组查询group by时候没有按照索引走。使用了临时表,更加严重影响效率。
  • Using index:表示相应的select操作中使用到了覆盖索引,避免访问表的数据行。如果同时出现Using where,表示索引被用来执行索引值的查找,没有同时出现 Using where表示索引用来读取数据而非执行查找。

表驱动

  • select * from A where id in (select id from B) --> B的数据小于A
  • select * from B where exists (select 1 from A where A.id = B.id) ---> B的数据小于A

原文地址:https://www.cnblogs.com/QullLee/p/12266967.html

时间: 2024-11-11 00:34:38

MySQL索引及执行计划的相关文章

mysql的索引和执行计划

一.mysql的索引 索引是帮助mysql高效获取数据的数据结构.本质:索引是数据结构 1:索引分类 普通索引:一个索引只包含单个列,一个表可以有多个单列索引. 唯一索引:索引列的值必须唯一 ,但允许有空值. 复合索引:一个索引包含多个列. 聚集索引:并不是一种单独的索引类型,而是一种数据存储方式.innodb磁盘存储,.ibd数据和索引放在一个文件夹下. 非聚集索引:不是聚集索引的,就是非聚集索引. 2:语法 查看索引        show index from table: 创建索引 cr

Mysql优化之执行计划查看

我们经常说到mysql优化,优化中一种常见的方式就是对于经常查询的字段创建索引.那么mysql中有哪些索引类型呢? 一.索引分类1.普通索引:即一个索引只包含单个列,一个表可以有多个单列索引 2.唯一索引:索引列的值必须唯一,但允许有空值 3.复合索引:即一个索引包含多个列 4.聚簇索引(聚集索引):并不是一种单独的索引类型,而是一种数据存储方式.具体细节取决于不同的实现,InnoDB的聚簇索引其实就是在同一个结构中保存了B-Tree索引(技术上来说是B+Tree)和数据行. 5.非聚簇索引:不

Mongodb索引和执行计划 hint 慢查询

查询索引 索引存放在system.indexes集合中 > show tables address data person system.indexes 默认会为所有的ID建上索引 而且无法删除 > db.system.indexes.find() { "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "

mysql的sql执行计划详解

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

SQL Server 执行计划利用统计信息对数据行的预估原理二(为什么复合索引列顺序会影响到执行计划对数据行的预估)

本文出处:http://www.cnblogs.com/wy123/p/6008477.html 关于统计信息对数据行数做预估,之前写过对非相关列(单独或者单独的索引列)进行预估时候的算法,参考这里. 今天来写一下统计信息对于复合索引在预估时候的计算方法和潜在问题. 本文原形来自于是个实际业务问题,某SQL在利用一个符合索引做查询的时候,发现始终会出现预估误差较大的情况, 而改变复合索引的列顺序,这个预估行数的误差会发生变化, 也就是说,Create  index idx_index1 ON T

MySQL索引(九)

一.索引介绍 1.1 什么是索引 索引就好比一本书的目录,它会让你更快的找到内容. 让获取的数据更有目的性,从而提高数据库检索数据的性能. 分为以下四种: BTREE:B+树索引(基本上都是使用此索引) HASH:HASH索引 FULLTEXT:全文索引 RTREE:R树索引 树形结构(B树:B树.B+树.B*树), B树索引由多个层次构成:‘根’,‘枝’,‘叶’,它建立在表的列上 stu(id, name, age) 假如说,在id列上建索引 A. 对id列的值,进行自动排序,把这些值有规律的

Oracle执行计划里的 access和filter有什么区别

Prediceate(谓词):一个查询中的WHERE限制条件. 在查看执行计划的信息中,经常会看到两个谓词filter和access ,它们的区别是什么,理解了这个两个词对我们解读Oracle的执行计划信息会有所帮助. 简单地说,执行计划如果显示是access,就表示这个谓词条件的值将会影响数据的访问路径(表还是索引),而filter表示谓词条件的值并不会影响数据访问路径,只起到过滤的作用. 二.举例说明: ----创建一张表echo---- 1 SQL> create table echo a

浅析SQL SERVER执行计划中的各类怪相

在查看执行计划或调优过程中,执行计划里面有些现象总会让人有些疑惑不解: 1:为什么同一条SQL语句有时候会走索引查找,有时候SQL脚本又不走索引查找,反而走全表扫描? 2:同一条SQL语句,查询条件的取值不同,它的执行计划会一致吗? 3: 同一条SQL语句,其执行计划会变化,为什么 4: 在查询条件的某个或几个字段上创建了索引,执行计划就一定会走该索引吗? 5:同时存在几个索引,SQL语句会走那个索引? ..............................................

如何通过outline为SQL语句指定执行计划

创建测试表 以用户jyu连接,创建测试表 SQL> conn jyu/jyu; Connected. SQL> create table t (id number, name varchar2(100)); Table created. SQL> insert into t select rownum,object_name from dba_objects; 47391 rows created. SQL> commit; Commit complete. 创建索引 SQL>