首先我们来了解一下最左匹配原则,如下:

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

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

分析讲解

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

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

(免费学习视频教程推荐:mysql视频教程)

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

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教程

mysql 如何看索引命中_mysql索引命中规则讲解相关推荐

  1. mysql 索引未命中_mysql索引命中规则

    最左匹配原则 1.先定位该sql的查询条件,有哪些,那些是等值的,那些是范围的条件. 2.等值的条件去命中索引最左边的一个字段,然后依次从左往右命中,范围的放在最后. 分析讲解 1.mysql的索引分 ...

  2. mysql验证索引正确性_mysql索引测试

    生成测试数据: 创建表用于测试: /*创建t_user表用于数据测试*/ DROP TABLE IF EXISTS t_user; CREATE TABLE `t_user` ( `id` bigin ...

  3. mysql 索引设计_MySQL 索引原理及设计

    原标题:MySQL 索引原理及设计 索引一直是数据库中非常重要的概念,所以了解索引相关的知识是转入后端开发中必不可少的一环.这篇文章是我从开始做后端开发之后至今学习关于索引知识的一个总结,从原先很多概 ...

  4. mysql 索引查询_mysql索引的建立和查询语句优化

    首先表内容展示: # 300W条的模拟数据 # 并且没有建立任何索引 不建立索引的查询时间: 以id查询的(4秒多): 以email查询的(4秒多): 建立主键索引后: alter table s1 ...

  5. mysql多索引结构_MySQL 索引结构

    谈到 MYSQL 索引服务端的同学应该是熟悉的不能再熟悉,新建表的时候怎么着都知道先来个主键索引,对于经常查询的列也会加个索引加快查询速度.那么 MYSQL 索引都有哪些类型呢?索引结构是什么样的呢? ...

  6. mysql索引分析_MySQL索引分析和优化

    什么是索引? 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里面 ...

  7. mysql 索引 原理_MySQL索引实现原理分析

    目前大部分数据库系统及文件系统都采用B-Tree(B树)或其变种B+Tree(B+树)作为索引结构.B+Tree是数据库系统实现索引的首选数据结构.在MySQL中,索引属于存储引擎级别的概念,不同存储 ...

  8. mysql left join 索引失效_MySQL索引列上做操作导致索引失效案例分析

    索引列上做操作导致索引失效 通常我们认为只要建立索引就可以万事大吉,以为只要建立就一定会使用到,可其实在索引列上的计算.函数.类型转换都可能导致索引失效,所以我们不仅要会创建索引,更重要的是如何正确的 ...

  9. mysql查询索引位置_mysql索引在什么位置

    mysql索引的位置在[数据库安装目录\data\databasename].索引是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能非常关键. MySQL中索引的简介 (视频教程推荐:mys ...

最新文章

  1. redis + php 简单的 队列 入队-出队
  2. 基于corosync和NFS服务器实现LNMP的高可用
  3. oracle在数据表中获取年月日时分秒
  4. 算法【二分查找】(数组)
  5. hessian学习笔记
  6. 零基础学python难吗-终于明白0基础学python难吗
  7. Python学习笔记--Python字符串连接方法总结
  8. 39. PHP 错误与异常处理(3)
  9. POJ 2377 Bad Cowtractors
  10. Sql server 密钥
  11. 超大图片(4000×3000像素)的畸变矫正,python+OpenCV实现
  12. 4k纸是几厘米乘几厘米_4k素描纸是多大? 是几乘几的?
  13. 【校内模拟】八云蓝(线段树)(大力分类讨论)
  14. 基于 Robot Framework 实现网络自动化测试
  15. tauri打包慢:解决tauri的打包慢以及超时的方法
  16. 就业双方合同、三方合同、用人单位类别、编制
  17. OpenVINO 环境配置
  18. PostgreSQL 数据库赋权命令
  19. Rust 基础(三)
  20. Fiddler:限制网速,模拟弱网

热门文章

  1. html语言中行距如何设定,html怎么设置行间距离
  2. 20220215-CTF-MISC-BUUCTF-小明的保险箱-binwalk分析-dd命令分离出RAR文件-ARCHPR暴力破解密码
  3. 奋斗的小孩系列 FPGA学习altera系列: FPGA学习altera 系列 第二十一篇 数码管设计
  4. animator动画
  5. 计算机知识竞赛策划书前言,计算机知识竞赛策划书范文.docx
  6. 《软件工程》网上书店项目设计活动
  7. 汽车租赁系统测试java,Java测试-----达达租车系统
  8. Java实现 对ip白名单的限制
  9. 中职计算机英语教师教学总结,中职教师工作总结
  10. java中trim_JAVA中trim()函数使用方法