精华内容
下载资源
问答
  • mysql索引命中规则

    2020-09-03 10:43:13
    mysql索引命中规则 当我们有一条SQL: select * from student where name=‘张三’ and age=15 and phone=‘13873062211’; 创建一个简单的单列索引: alter table student add index name_index (name); 将name列建...

    mysql索引命中规则

    当我们有一条SQL:
    select * from student where name=‘张三’ and age=15 and phone=‘13873062211’;
    创建一个简单的单列索引:
    alter table student add index name_index (name);
    将name列建索引,这样就把范围限制在name='张三’的结果集上,之后扫描结果集,产生满足age=15的结果集,再扫描该结果集,找到 phone='13873062211’的结果集,即最终结果。

    展开全文
  • Mysql索引命中规则

    2020-07-16 18:13:56
    2、等值的条件去命中索引最左边的一个字段,然后依次从左往右命中,范围的放在最后。 分析讲解 1、mysql索引分为聚簇索引和非聚簇索引mysql的表是聚集索引组织表。 聚集规则是:有主键则定义主键索引为聚集...

    最左匹配原则 

    1、先定位该sql的查询条件,有哪些,那些是等值的,那些是范围的条件。 

    2、等值的条件去命中索引最左边的一个字段,然后依次从左往右命中,范围的放在最后。

    详细最左匹配原则请查看,https://blog.csdn.net/dshf_1/article/details/107389598

     

    分析讲解 

    1、mysql的索引分为聚簇索引和非聚簇索引,mysql的表是聚集索引组织表。 

    聚集规则是:有主键则定义主键索引为聚集索引;没有主键则选第一个不允许为NULL的唯一索引;还没有就使用innodb的内置rowid为聚集索引。 

    非聚集索引也称为二级索引,或者辅助索引。 

    2、mysql的索引无论是聚集索引还是非聚集索引,都是B+树结构。聚集索引的叶子节点存放的是数据,非聚集索引的叶子节点存放的是非聚集索引的key和主键值。B+树的高度为索引的高度。 

    3、索引的高度 

    聚集索引的高度决定了根据主键取数据的理论IO次数。根据非聚集索引读取数据的理论IO次数还要加上访问聚集索引的IO次数总和。实际上可能要不了这么多IO。因为索引的分支节点所在的Page因为多次读取会在mysql内存里cache住。 

    mysql的一个block大小默认是16K,可以根据索引列的长度粗略估算索引的高度。 

    sql优化依据 

    SQL语句中的where条件,使用以上的提取规则,最终都会被提取到Index Key (First Key & Last Key),Index Filter与Table Filter之中。

     

    Index First Key,只是用来定位索引的起始范围,因此只在索引第一次Search Path(沿着索引B+树的根节点一直遍历,到索引正确的叶节点位置)时使用,一次判断即可;

     

    Index Last Key,用来定位索引的终止范围,因此对于起始范围之后读到的每一条索引记录,均需要判断是否已经超过了Index Last Key的范围,若超过,则当前查询结束;

     

    Index Filter,用于过滤索引查询范围中不满足查询条件的记录,因此对于索引范围中的每一条记录,均需要与Index Filter进行对比,若不满足Index Filter则直接丢弃,继续读取索引下一条记录;

     

    Table Filter,则是最后一道where条件的防线,用于过滤通过前面索引的层层考验的记录,此时的记录已经满足了Index First Key与Index Last Key构成的范围,并且满足Index Filter的条件,回表读取了完整的记录,判断完整记录是否满足Table Filter中的查询条件,同样的,若不满足,跳过当前记录,继续读取索引的下一条记录,若满足,则返回记录,此记录满足了where的所有条件,可以返回给前端用户

     

    分析 

    一条sql语句要执行完成需要经历什么样的过程 

    当一条sql语句提交给mysql数据库进行查询的时候需要经历以下几步 

    1、先在where解析这一步把当前的查询语句中的查询条件分解成每一个独立的条件单元 

    2、mysql会自动将sql拆分重组 

    3、然后where条件会在B-tree index这部分进行索引匹配,如果命中索引,就会定位到指定的table records位置。如果没有命中,则只能采用全部扫描的方式 

    4、根据当前查询字段返回对应的数据值 

    Mysql - 什么情况下索引不会被命中

    1、如果条件中有 or ,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)

    注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

    如果出现OR的一个条件没有索引时,建议使用 union ,拼接多个查询语句 ,详细请见https://blog.csdn.net/dshf_1/article/details/107389669
    2.、like查询是以%开头,索引不会命中
    只有一种情况下,只查询索引列,才会用到索引,但是这种情况下跟是否使用%没有关系的,因为查询索引列的时候本身就用到了索引
    3. 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

    4. 没有查询条件,或者查询条件没有建立索引

    5. 查询条件中,在索引列上使用函数(+, - ,*,/), 这种情况下需建立函数索引

    6. 采用 not in, not exist

    7. B-tree 索引 is null 不会走, is not null 会走

    展开全文
  • Mysql 索引命中规则

    2019-08-24 23:12:53
    1.like前缀命中,如 xx% ,,而%xx%,%xx 无法命中索引 2.or 应该无法命中索引 3.在where语句中 使用!= 或< >这种操作符,无法命中索引 4.where语句中,做null值判断,无法命中 5.组合索引的话,如(a,b,c)上建立...

    1.like前缀命中,如 xx% ,,而%xx%,%xx 无法命中索引
    2.or 应该无法命中索引
    3.在where语句中 使用!= 或< >这种操作符,无法命中索引
    4.where语句中,做null值判断,无法命中
    5.组合索引的话,如(a,b,c)上建立组合索引,则a|(a,b)|(a,b,c)能命中索引(最左匹配原则)
    比如你select * from table where b='xx' , 是无法命中索引的
    6. where语句中,对查询条件做+-*/,无法命中索引。

    展开全文
  • mysql 索引命中规则 不命中的情况

    千次阅读 2019-12-01 09:18:35
    mysql 索引命中规则多列索引 遵循:最左匹配原则不会命中索引的情况 当一条sql语句提交给mysql数据库进行查询的时候需要经历以下几步 1、先在where解析这一步把当前的查询语句中的查询条件分解成每一个独立的条件...

    当一条sql语句提交给mysql数据库进行查询的时候需要经历以下几步
    1、先在where解析这一步把当前的查询语句中的查询条件分解成每一个独立的条件单元
    2、mysql会自动将sql拆分重组
    3、然后where条件会在B-tree index这部分进行索引匹配,如果命中索引,就会定位到指定的table records位置。如果没有命中,则只能采用全部扫描的方式
    4、根据当前查询字段返回对应的数据值


    多列索引 遵循:最左匹配原则

    ALTER TABLE student ADD INDEX userName_age_phone_index (userName,age,phone);
    这种创建索引的方式在多项查找时要优于单一索引,由于mysql的采用的b+树方式,因此不在需要扫描任何记录,直接就可以得到满足需求的结果集。而这种方式其实相当于创建了三个索引(userName),(userName,age),(userName,age,phone)。

    因此在当进行以下查询时仍会命中mysql索引
    select * from student where userName=‘小明’;
    select * from student where userName=‘小明’ and age=19;
    select * from student where userName=‘小明’ and age=19 and phone=‘1887821’;


    不会命中索引的情况

    1. 如果where后面有or,这样不会命中索引如:
      select * from student where userName=‘小明’ or age=19;
      如果想要or后面的也走索引的话,应该是创建两个单列索引

    2. like是以%开头的不会命中索引如:
      select * from student where userName like %明

    3. 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引如:
      select * from student where userName=‘小明’ and age=19 and phone=1887821 ;
      phone 定义的数据格式是字符串,但是sql中使用的整型

    4. 没有查询条件,或者查询条件没有建立索引

    5. 查询条件中,在索引列上使用函数(+/-*/)
      select * from student where userName=‘小明’ and age-1=19 错误
      select * from student where userName=‘小明’ and age=20 正确

    6. 采用 not in, not exist,!=, <> , is null , is not null 不会命中索引

    案例分析

    表有3个普通索引

    KEY idx_channel (channel),
    KEY idx_store_id (store_id),
    KEY idx_clue_id (clue_id)

    • explain select * from biz_order where store_id = 20036
      在这里插入图片描述

    • explain select * from biz_order where store_id = 20036 order by channel
      在这里插入图片描述

    • explain select * from biz_order order by channel
      在这里插入图片描述

    • explain select * from biz_order where store_id = 20036 group by clue_id order by channel
      在这里插入图片描述
      可看到通过group by命中了idx_clue_id索引, order by 未命中索引

    展开全文
  • 浅谈mysql索引命中规则

    千次阅读 2018-12-20 19:11:10
    举个例子 当进行一条sql查询时: select * from student where userName='小明' and age=19 and phone='1887821'; 创建了一个单列索引: ... 将userName列建索引,这样就把范围限制在userName=...
  • MySql 索引命中规则

    2020-07-28 15:21:17
    在解释索引命中规则的前提下, 先了解一下如下原则: 最左匹配原则: 最左前缀匹配原则, mysql会一只向右匹配直到遇到范围查询(>, <, between, like)就停止匹配, 比如a=1 and b=2 and c>3 and d=4 如果建立了...
  • 多个索引时,mysql索引命中规则

    千次阅读 2019-06-10 11:56:28
    在解释索引命中规则的前提下, 先了解一下如下原则: 最左匹配原则: 最左前缀匹配原则, mysql会一只向右匹配直到遇到范围查询(>, <, between, like)就停止匹配, 比如a=1 and b=2 and c>3 and d=4 如果建立...
  • MYSQL索引命中

    千次阅读 2019-04-07 14:45:29
    一、MySQL 索引类型 1、从物理存储角度上,索引可以分为聚集索引和非聚集索引。 ①.聚集索引(Clustered Index) 聚集索引决定数据在磁盘上的物理排序,一个表只能有一个聚集索引。 ②. 非聚集索引(Non-...
  • Mysql索引命中问题

    千次阅读 2018-11-09 15:33:24
    索引概念和作用   索引是一种使记录有序化的技术,它...MySQL 索引类型   从物理存储角度上,索引可以分为聚集索引和非聚集索引。   1. 聚集索引(Clustered Index)   聚集索引决定数据在磁盘上的物...
  • 索引命中规则详解

    千次阅读 2019-06-30 15:10:00
    索引命中规则详解: t这张表 a,b,c 三个字段组成组合索引 索引命中规则详解: t这张表 a,b,c 三个字段组成组合索引 select * from t where a=? and b=? and c=? 全命中 select * from t where c=? and b=? and...
  • Mysql orderby limit 索引命中规则

    千次阅读 2018-12-11 17:47:47
    最近做的一个项目,发现了sql慢...表结构不展示啦 直接看索引 (公司的表不方便泄露 假如是table_name吧) ~SHOW INDEX FROM table_name (列出索引信息) 问题sql (我是想通过questionId 进行排序 做分页处理 3...
  • mysql索引命中

    2018-04-02 16:44:23
    有多少是命中索引的?命中哪个索引?索引中有哪个是无效索引?这些无效索引是否会影响系统的性能?带着这些问题我们一起来学习一下. MySql中是通过 Explain 命令来分析低效SQL的执行计划。命令的使用很简单.示例 ...
  • mysql索引命中分析

    千次阅读 2017-11-30 14:18:39
    本文将告知mysql索引类型,sql的依据,什么时候会使用索引,什么情况不会使用索引
  • mysql 联合索引命中规则

    千次阅读 2017-10-02 11:43:00
    而不用两个单列索引,这是因为一条查询语句往往应为mysql优化器的关系只用一个索引,就算你有两个索引,他也只用一个;在只用一个的基础之上,联合索引是会比单列索引要快的; 下面讲讲联合索引的使用规则和哪些情
  • 1.索引无法存储null值  a.单列索引无法储null值,复合索引无法储全为null的值。  b.查询时,采用is null条件时,不能利用到索引,只能全表扫描。  为什么索引列无法存储Null值?  a.索引是有序的。NULL值...
  • 本文中联合索引的定义为(MySQL): ALTER TABLE table_name ADD INDEX (col1,col2,col3); 二、联合索引的本质 当创建(col1,col2,col3)联合索引时,相当于创建了(col)单列索引,(clo1,clo2)联合索引以及(col1,col2,...
  • 索引命中规则

    2019-11-25 14:51:56
    t这张表 a,b,c 三个字段组成组合索引 select * from t where a=?... 全命中 解析MySQL的查询优化器会自动调整where子句的条件顺序以使用适合的索引 select * from t where a=? 命中a 解析:最左前缀匹配...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 30,819
精华内容 12,327
关键字:

mysql索引命中规则

mysql 订阅