什么时候添加B+树索引呢?

在访问表中很少一部分时使用B+树索引才有意义。

Q: 怎么查看索引是否是高选择性的呢?

A:可以通过SHOW INDEX 结果中的列 Cardinality 来观察。Cardinality 表示索引中不重复记录数量的预估值。

Q: 为什么Cardinality 是预估值呢?

A : 因为Cardinality 是通过采样(Sample)的方法来完成的。默认InnoDB存储引擎会对8个叶子节点(Leaf Page)进行采用。

取得B+树索引中叶子节点的数量,记为A。随机取得B+树索引中的8个叶子节点。统计每个页不同记录的个数,即为P1,P2,...,P8.

根据采样信息给出Cardinality 的预估值:Cardinality = (P1+P2+....+P8) * A/8

Q: 更新Cardinality 的策略是什么呢?

A: 表中 1/16的数据已发生过变化。

stat_modified_counter>2 000 000 000. 变化次数

不同应用中B+树索引的使用

  1. 在具体的生产环境中使用索引,并观察索引使用的情况
  2. 判断是否真的需要使用索引,不要盲从任何人给你的经验意见,Think Different. => 独立思考,养成独立思考的习惯,关注实际问题。

联合索引

可以使用联合索引在一些 order by 的场景下去优化我们的Sql,减少查询的时间

覆盖索引

从辅助索引中就可以得到查询记录,而不需要查询聚集索引中的记录。使用覆盖索引的好处是辅助索引不包含整行记录的所有信息,故其大小要远小于聚集索引,因此可以减少大量的IO操作。也就是不回表。

某些统计问题可以走辅助索引,辅助索引小于聚集索引,可以减少IO操作。

优化器不走索引的情况

用户要选取的数据是整行数据信息,而辅助索引不能覆盖我们要查询的信息。因为走了辅助索引以后,我们还要进行一次书签访问来查找整行的数据细腻下。虽然辅助索引是顺序存放的,但是再一次进行书签查找的数据则是无序的,因为变为了磁盘上的离散读操作。 顺序读 > 离散读。

Multi-Range Read 优化

Multi-Range Read 优化的目的就是为了减少磁盘的随机访问,并且将随机访问转化为较为顺序的数据访问。

MRR 优化的好处:

  1. MRR 使数据访问变得较为顺序。在查询辅助索引时,首先根据得到的查询结果,按照主键进行排序,并按照主键排序的顺序进行书签查找。
  2. 减少缓冲池中页被替换的次数
  3. 批量处理对键值的查询操作

核心思路: 随机访问 =》较为顺序的数据访问。

Index Condition Pushdown(ICP) 优化

不使用索引下推:根据索引查找记录,然后再根据 WHERE 条件来过滤记录

支持索引下推: MySQL 数据库会在取出索引的同时,判断是否可以进行WHERE 条件的过滤

个人的一些思考:

  1. 建议还是直接写SQL, 不使用orm框架,因为直接写sql 你会很明确你要获取什么样的数据,怎么获取,也会去思考它的索引

  2. 如果不用全部字段拿出来,最好不要 select *

MySQL技术内幕 InnoDB存储引擎 B+树索引的使用 笔记的更多相关文章

  1. (转)Mysql技术内幕InnoDB存储引擎-表&索引算法和锁

    表 原文:http://yingminxing.com/mysql%E6%8A%80%E6%9C%AF%E5%86%85%E5%B9%95innodb%E5%AD%98%E5%82%A8%E5%BC% ...

  2. MySQL技术内幕InnoDB存储引擎(表&索引算法和锁)

    表 4.1.innodb存储引擎表类型 innodb表类似oracle的IOT表(索引聚集表-indexorganized table),在innodb表中每张表都会有一个主键,如果在创建表时没有显示 ...

  3. 《mysql技术内幕 InnoDB存储引擎(第二版)》阅读笔记

    一.mysql架构 mysql是一个单进程多线程架构的数据库. 二.存储引擎 InnoDB: 支持事务 行锁 读操作无锁 4种隔离级别,默认为repeatable 自适应hash索引 每张表的存储都是 ...

  4. Mysql技术内幕——InnoDB存储引擎

    Mysql技术内幕——InnoDB存储引擎 http://jingyan.baidu.com/article/fedf07377c493f35ac89770c.html 一.mysql体系结构和存储引 ...

  5. mysql技术内幕InnoDB存储引擎-阅读笔记

    mysql技术内幕InnoDB存储引擎这本书断断续续看了近10天左右,应该说作者有比较丰富的开发水平,在源码级别上分析的比较透彻.如果结合高可用mysql和高性能mysql来看或许效果会更好,可惜书太 ...

  6. MySQL技术内幕InnoDB存储引擎(三)——文件相关

    构成MySQL数据库和InnoDB存储引擎表的文件类型有: 参数文件:MySQL实例运行时需要的参数就是存储在这里. 日志文件:用来记录MySQL实例对某种条件做出响应时写入的文件. socket文件 ...

  7. 《MySQL技术内幕 InnoDB存储引擎 》学习笔记

    第1章  MySQL体系结构和存储引擎 1.3 MySQL存储引擎 数据库和文件系统最大的区别在于:数据库是支持事务的 InnoDB存储引擎: MySQL5.5.8之后默认的存储引擎,主要面向OLTP ...

  8. 【Mysql技术内幕InnoDB存储引擎】读书笔记

    一.存储引擎 1.InnoDB引擎 设计目标是面向在线事务(OLTP)处理的应用. 支持事务.行级锁.通过多版本并发控制(MVCC)支持高并发.提供一致性非锁定读.next-key locking避免 ...

  9. MySQL技术内幕InnoDB存储引擎(七)——事务

    什么是数据库的事务? 事务是访问并更新数据库中各种数据的一个程序执行单元.事务也是数据库区别于文件系统的一个重要特性. 事务需要满足的特性 1.原子性 原子性就是指数据库中的一个完整的事务是不可分割的 ...

  10. MySQL技术内幕InnoDB存储引擎(二)——InnoDB存储引擎

    1.概述 是一个高性能.高可用.高扩展的存储引擎. 2.InnoDB体系架构 InnoDB存储引擎主要由内存池和后台线程构成. 其中,内存池由许多个内存块组成,作用如下: 维护所有进程和线程需要访问的 ...

随机推荐

  1. 变速精灵+百D网盘

    首先找一下相对低一点版本的客户端,比如7.26.10 https://issuepcdn.baidupcs.com/issue/netdisk/yunguanjia/BaiduNetdisk_7.26 ...

  2. CentOS 7 下 Docker 的离线安装方法

    现遇到部分学校提供的服务器并没有外网连接,故需要在断网条件下安装 Docker ,本贴简述断网安装 Docker 的方法. 去 Docker 或者相关镜像源中下载 Docker RPM 包,以下链接的 ...

  3. BUUCTF---这是Base??

    题目 dict:{0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y', 8: 'U', 9: 'V', 10: 'z', 11 ...

  4. AI穿上身:苹果手表如何改变你的生活?

    楔子:一个普通理工男的科技启示录 我是张三,一个标准的90后理工男.在这个日新月异的科技时代,我习惯用精密的逻辑和近乎机械的效率来审视世界.每天早上6点45分准时起床,每一分钟都被精确地规划,生活就像 ...

  5. verilog实现32位有符号流水乘法器

    verilog实现32位有符号流水乘法器 1.4bit乘法流程 1.无符号X无符号二进制乘法器 以下为4bit乘法器流程(2X6) 0 0 0 0 0 0 1 0 (2) X 0 0 0 0 0 1 ...

  6. 【Linux】3.3 关机、重启和用户登录注销

    关机.重启和用户登录注销 1. 关机&重启命令 1.1 shutdown shutdown -h now:表示立即关机 shutdown -h 1:表示1分钟后关机 shutdown -r n ...

  7. Visual Studio 外部工具中添加 git-bash

    引言 旧版的 Visual Studio 没有集成 git 工具,并且自己也习惯用 git-bash 命令行来操作, 那么如何在旧版的 Visual Studio 快速打开 git-bash 终端呢? ...

  8. Devops工程师需要具备的10项技能

    Facebook.Amazon和Microsoft等公司正在大量使用DevOps技术来确保软件的一致交付,DevOps的的工作机会和所需要的技能集也是越来越多. 在这里,我们将讨论Devops工程师需 ...

  9. 基于Spring Boot的HTTP请求签名验证实现解析

    概述 在分布式系统交互中,API接口的安全性至关重要.本文将深入解析基于Spring Boot实现的HTTP请求签名验证机制,该方案支持GET/POST等多种请求方式,提供时效性验证和数据完整性保障. ...

  10. 基于注解的 AOP 配置

    第一步:在 spring 配置文件中开启 spring 对注解 AOP 的支持 <!-- 开启 spring 对注解 AOP 的支持 --> <aop:aspectj-autopro ...