精华内容
下载资源
问答
  • MySQL索引未命中优化

    千次阅读 2018-12-28 11:39:18
    业务SQL使用索引不见得就是优化的SQL,依然存在索引未命中的风险,例如存在多个匹配索引,可能命中索引不是你想要的那个索引,可以通过explain来分析:  explain SELECT count(id) FROM active_task_log a WHERE...

    业务SQL使用索引不见得就是优化的SQL,依然存在索引未命中的风险,例如存在多个匹配索引,可能命中的索引不是你想要的那个索引,可以通过explain来分析:

     explain SELECT count(id)  FROM active_task_log a WHERE a.add_time >= '2018-12-01' AND a.add_time <= '2018-12-20' AND a.task_class = 7 AND a.task_type = 0 AND a.del_flag = 0;

    这里重要的字段是:

    type:ALL全表扫描,未命中索引,这是最差的情况。

    possible_keys:可能用到的索引

    key:实际命中的索引

    rows:执行查询的行数,越小越好。

    如果possible_key有索引,而key显示实际未命中索引,则需要强制命中索引force index(idx_addTime_taskClass)

    SELECT count(id)  FROM active_task_log a force index(idx_addTime_taskClass) WHERE a.add_time >= '2018-12-01' AND a.add_time <= '2018-12-20' AND a.task_class = 7 AND a.task_type = 0 AND a.del_flag = 0;

    以上是最近做钉钉数据推送时遇到的SQL索引未命中的解决办法。
            
     

    展开全文
  • 多个索引时,mysql索引命中规则

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

    在解释索引命中规则的前提下, 先了解一下如下原则:

    最左匹配原则:

    1. 最左前缀匹配原则, mysql会一只向右匹配直到遇到范围查询(>, <, between, like)就停止匹配, 比如a=1 and b=2 and c>3 and d=4 如果建立了(a,b,c,d)顺序的索引, d是用不到索引的, 如果建立(a,b,d,c)的索引, 则都可以使用到, a,b,d的顺序可以任意调整.
    2. = 和 in 可以乱序, 比如 a=1 and b=2 and c=3 建立(a,b,c)索引可以任意顺序, mysql 的查询优化器会帮你优化成索引可以识别的形式.

    1.联合索引

    使用情况:
    对于查询语句"select e.* from e where e.e1=1 and e.e3=2"涉及到两列, 这个时候我们一般采用一个联合索引(e1, e3); 而不用两个单列索引, 这是因为一条查询语句往往应为mysql优化器的关系只用了一个索引, 就算你有两个索引, 他也只会用到一个(Mysql的最左匹配原则) ; 在只用到一个的基础上, 联合索引是会比单列索引要快的;

    命中规则:
    示例: create table e(e1 int, e2 varchat(9), e3 int, primary key(e1, e3));
    这样就建立了一个联合索引: e1, e3

    • 使用联合索引的全部索引键, 可触发索引的使用.
      如: select e.* from e where e.e1=1 and e.e3=2
    • 查询条件中包含索引的前缀部分, 也就是 e1, 可以触发索引的使用
      如: select e.* from e where e.e1=1
    • 使用部分索引键, 但不包含索引的前缀部分,不可触发索引的使用。
      如: select e.* from e where e.e3=1
    • 使用联合索引的全部索引键, 但不是AND操作, 不可以触发索引的使用
      如: select e.* from e where e.e3=2 or e.e1=1

    2.普通索引

    就是最基本的索引, 查他就能命中

    3. 唯一索引

    和普通索引类似, 不同的就是索引的列必须是唯一存在的, 可以为空

    4. 全文索引

    只支持老版本的MySql 也就是引擎为MyISAM的数据表.

    原文链接:https://blog.csdn.net/qq_41637554/article/details/86629919

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

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

    在解释索引命中规则的前提下, 先了解一下如下原则:

    最左匹配原则:

    最左前缀匹配原则, mysql会一只向右匹配直到遇到范围查询(>, <, between, like)就停止匹配, 比如a=1 and b=2 and c>3 and d=4 如果建立了(a,b,c,d)顺序的索引, d是用不到索引的, 如果建立(a,b,d,c)的索引, 则都可以使用到, a,b,d的顺序可以任意调整.
    = 和 in 可以乱序, 比如 a=1 and b=2 and c=3 建立(a,b,c)索引可以任意顺序, mysql 的查询优化器会帮你优化成索引可以识别的形式.

    1.联合索引

    使用情况:
    对于查询语句"select e.* from e where e.e1=1 and e.e3=2"涉及到两列, 这个时候我们一般采用一个联合索引(e1, e3); 而不用两个单列索引, 这是因为一条查询语句往往应为mysql优化器的关系只用了一个索引, 就算你有两个索引, 他也只会用到一个(Mysql的最左匹配原则) ; 在只用到一个的基础上, 联合索引是会比单列索引要快的;

    命中规则:
    示例: create table e(e1 int, e2 varchat(9), e3 int, primary key(e1, e3));
    这样就建立了一个联合索引: e1, e3

    使用联合索引的全部索引键, 可触发索引的使用.
    如: select e.* from e where e.e1=1 and e.e3=2
    查询条件中包含索引的前缀部分, 也就是 e1, 可以触发索引的使用
    如: select e.* from e where e.e1=1
    使用部分索引键, 但不包含索引的前缀部分,不可触发索引的使用。
    如: select e.* from e where e.e3=1
    使用联合索引的全部索引键, 但不是AND操作, 不可以触发索引的使用
    如: select e.* from e where e.e3=2 or e.e1=1
    2.普通索引
    就是最基本的索引, 查他就能命中

    3. 唯一索引
    和普通索引类似, 不同的就是索引的列必须是唯一存在的, 可以为空

    4. 全文索引
    只支持老版本的MySql 也就是引擎为MyISAM的数据表.

    展开全文
  • 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-07-18 16:58:27
    首先明确:为什么要用联合索引? 对于查询语句“SELECT E.* FROM E WHERE E.e1=1 AND E.e3=2”涉及到两列,这个时候...而不用两个单列索引,这是因为一条查询语句往往应为mysql优化器的关系只用一个索引,就算你...
  • mysql 索引命中规则 不命中的情况

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

    2020-11-10 09:33:50
    2.、like查询是以%开头,索引不会命中 只有一种情况下,只查询索引列,才会用到索引,但是这种情况下跟是否使用%没有关系的,因为查询索引列的时候本身就用到了索引 3.如果列类型是字符串,那一定要在条件中将...
  • MYSQL索引命中

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

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

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

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

    千次阅读 2017-11-30 14:18:39
    本文将告知mysql索引类型,sql的依据,什么时候会使用索引,什么情况不会使用索引
  • mysql索引无法命中情况 1,查询占表数据30%以上 2,小表查询 3,规定不用索引查询 4,查询条件给字符串加引号用索引,否则不用 5,条件中用到or,除非涉及到的列都有索引否则不命中 6,like 的 %在前不命中,...
  • mysql索引不能命中

    2019-05-14 22:48:12
    在很多时候我们使用索引去搜索的时候,分析sql语句的时候,发现并没有使用索引,今天探讨一下这些情况。 先看一下表结构: CREATE TABLE `city` ( `ID` int(11) NOT NULL AUTO_INCREMENT, `Name` char(35) NOT...
  • 浅谈mysql索引命中规则

    千次阅读 2018-12-20 19:11:10
    举个例子 当进行一条sql查询时: select * from student where userName='小明' and age=19 and phone='1887821'; 创建了一个单列索引: ... 将userName列建索引,这样就把范围限制在userName=...
  • mysql中,主要有四种索引:B-tree索引,Hash索引,Fulltext索引和R-tree索引 索引功能: 1、保持数据完整性 2、优化数据访问性能 3、改进表的连接(join)操作 4、对结构进行排序 5、简化聚合数据操作 innodb存储...
  • 1.索引无法存储null值  a.单列索引无法储null值,复合索引无法储全为null的值。  b.查询时,采用is null条件时,不能利用到索引,只能全表扫描。  为什么索引列无法存储Null值?  a.索引是有序的。NULL值...
  • mysql 联合索引命中规则

    千次阅读 2017-10-02 11:43:00
    而不用两个单列索引,这是因为一条查询语句往往应为mysql优化器的关系只用一个索引,就算你有两个索引,他也只用一个;在只用一个的基础之上,联合索引是会比单列索引要快的; 下面讲讲联合索引的使用规则和哪些情
  • mysql组合索引,abc索引命中

    千次阅读 2020-09-23 15:28:29
    和a、c情况到底会不会命中索引? 网上查阅相关博客发现很多答案不一样,于是我干脆亲手操作实验一下 一:创建表 为了更直接贴合面试题,字段直接用AA,BB,CC表示 create table IF NOT EXISTS TEST_COMPOSITE_INDEX ( ...
  • mysql索引命中的问题

    千次阅读 2016-03-17 21:56:39
    索引用btree,hash区别
  • 本文中联合索引的定义为(MySQL): ALTER TABLE table_name ADD INDEX (col1,col2,col3); 二、联合索引的本质 当创建(col1,col2,col3)联合索引时,相当于创建了(col)单列索引,(clo1,clo2)联合索引以及(col1,col2,...

空空如也

空空如也

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

mysql索引未命中

mysql 订阅