mysql的索引和执行计划

一、mysql的索引

  索引是帮助mysql高效获取数据的数据结构。本质:索引是数据结构

  1:索引分类

    普通索引:一个索引只包含单个列,一个表可以有多个单列索引。

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

    复合索引:一个索引包含多个列。

    聚集索引:并不是一种单独的索引类型,而是一种数据存储方式。innodb磁盘存储,.ibd数据和索引放在一个文件夹下。

    非聚集索引:不是聚集索引的,就是非聚集索引。

  2:语法

    查看索引        show index from table;

    创建索引  

      create [unique] index indexname on table(columnname(length));

      alter table 表名 add [unique] index [indexname] on (columnname(length));

    删除索引  drop index [indexName] on table;

  3:适合建索引

    某一列相对来说唯一

    经常用来查询显示的列

    经常用来关联的列 where 条件中用到的列,以及join on 用到的列

二、mysql的执行计划

  使用explan关键字可以知道mysql是如何处理SQL语句的。

  id:相同,都不相同,不全部相同。

    相同:获取select的执行顺序。执行顺序由上到下。

    都不相同:如果是子查询,id序号会递增,id值越大优先级越高,越先被执行。

    不全部相同:id相同的认为一组,从上往下顺序执行。在所有组中,id值越大,优先级越高,越先被执行。

  select_type:查询的类型

    simple:简单的SQL语句,不包含union或者子查询。

    primary:查询中包含任何的子查询,最外层查询被标记。

    subquery:在select和where中,查询的任何子查询。

    derived:在from列表中包含子查询会被标记为derived,mysql会递归执行这些子查询,把结果放到临时表。

    union:若第二个select出现在union之后,则标记为UNION;若UNION包含在from子句的子查询中,外层select将被标记为derived。

    union result:从union表获取结果的select。

  table:查询来自那张表

  type:访问的类型,重要的一个指标,结果从最好到最坏。

    system》const》eq_ref>ref>range>index>all,最好达到ref或者range

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

    const:表示通过索引一次就找到了。用于primary或unique索引。因为只匹配一行数据。

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

    ref:非唯一索引扫描,返回匹配某个单独值的所有行。

    rang:只检索给定范围内的行,使用一个索引来选择行。key列显示使用那个索引,一般就是在你的where语句中出现between、<、>、in查询中。

    index:当查询的结果全为索引列的时候。也是全表扫描的一种。只不过扫描的全部索引。

    all:全表扫描。

    注:当出现index和all的时候,就应该去优化SQL语句。

  key:实际所用的索引。如果为null,则没有使用索引。

  possible_key:可能用到的key。possible_key有数据,但是不一定会使用key。key有数据,但是不一定会使用possible_key。这两者比一定都同时出现。

  key_len:表示索引使用的字节数,通过该列查询使用索引的长度。在不损失精确性的情况下,长度越短越好。

  ref:显示索引的哪一列被使用了,如果可能得话,是一个常数。

  rows:根据表的以及索引选用的情况,大致估算出需要读取的行数。扫描的行数越少越好。

  extra:包含不适合在其他列中显示,但重要的额外信息。

原文地址:https://www.cnblogs.com/orange-time/p/10595619.html

时间: 2024-11-11 11:19:34

mysql的索引和执行计划的相关文章

MySQL索引及执行计划

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

MySQL学习系列2--MySQL执行计划分析EXPLAIN

1.Explain语法 EXPLAIN SELECT -- 变体:   EXPLAIN EXTENDED SELECT -- 将执行计划"反编译"成SELECT语句,运行SHOW WARNINGS 可得到被MySQL优化器优化后的查询语句 2.执行计划分析和实例 创建员工表Employee create table Employee ( ID int auto_increment, Ename varchar(32), Age int, Salary float, MID int, P

MySQL 优化sql explain执行计划详解

mysql explain执行计划详解 1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. 2).select_type列常见的有:A:simple:表示不需要union操作或者不包含子查询的简单select查询.有连接查询时,外层的查询为simple,且只有一个B:primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary.且只有一个C:

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执行计划不准确 -概述

为毛 MySQL优化器的执行计划 好多时候都不准确,不是最优的呢(cpu+io)??? 因素太多了:: 存在information_schema的信息是定期刷新上去的,好多时候不是最真的,甚至相差好大(非高山峰时好好利用一下analyze table等): 现在一个企业有钱没地方花,买一大堆固态磁盘,碰巧非智能的MySQL不能很好滴跟上硬件优化的节奏,可能超过一部分的选择原理就不怎么准确了(这点相信其他数据库也是痛点吧); 环境因素/ 配置因素 等等 ... MySQL执行计划不准确 -概述,布

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

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

MySQL性能优化的21个最佳实践 和 mysql使用索引

1. 为查询缓存优化查询 当有很多相同的查询被执行了多次的时候,这些查询结果会被放到一个缓存中,这样,后续的相同的查询就不用操作表而直接访问缓存结果了. 2. EXPLAIN   SELECT 查询 使用 EXPLAIN 关键字可以知道MySQL是如何处理SQL语句的.这可以查询语句或是表结构的性能瓶颈. EXPLAIN 的查询结果还会索引主键被如何利用的,数据表是如何被搜索和排序的……等等 3. 当只要一行数据时使用 LIMIT 1 当查询表的有些时候,已经知道结果只会有一条结果,但因为可能需

Mysql设计索引的原则

内容来自书籍<深入浅出MySQL++数据库开发.优化与管理维护+第2版+唐汉明> 设计索引的原则1. 搜索的索引列,不一定是所要选择的列.换句话说,最适合索引的列是出现在 WHERE 子句中的列,或连接子句中指定的列,而不是出现在 SELECT 关键字后的选择列表中的 列 .2. 使用惟一索引.考虑某列中值的分布.对于惟一值的列,索引的效果最好,而具有多个重复值的列,其索引效果最差.例如,存放年龄的列具有不同值,很容易区分各行.而用来记录性别的列,只含有 " M " 和 &

MySQL的索引优化,查询优化

MySQL逻辑架构 如果能在头脑中构建一幅MySQL各组件之间如何协同工作的架构图,有助于深入理解MySQL服务器.下图展示了MySQL的逻辑架构图. MySQL逻辑架构,来自:高性能MySQL MySQL逻辑架构整体分为三层,最上层为客户端层,并非MySQL所独有,诸如:连接处理.授权认证.安全等功能均在这一层处理. MySQL大多数核心服务均在中间这一层,包括查询解析.分析.优化.缓存.内置函数(比如:时间.数学.加密等函数).所有的跨存储引擎的功能也在这一层实现:存储过程.触发器.视图等.