索引的树结构

二分查找

二叉树

二叉平衡树

B-TREE :二叉平衡树的基础上,使加载一次节点,可以加载更多路径数据,同时把查询范围缩减到更小

缺点:业务数据的大小可能远远超过了索引数据的大小,每次为了查找对比计算,需要把数据加载到内存以及 CPU 高速缓存中时,都要把索引数据和无关的业务数据全部查出来。本来一次就可以把所有索引数据加载进来,现在却要多次才能加载完。如果所对比的节点不是所查的数据,那么这些加载进内存的业务数据就毫无用处,全部抛弃。

B+TREE:非叶子节点只保存索引数据,叶子节点保存索引数据与业务数据所在的地址

聚簇索引和非聚簇索引

如果叶子节点存储的是实际数据的就是聚簇索引,一个表只能有一个聚簇索引;如果叶子节点存储的不是实际数据,而是主键值则就是二级索引,一个表中可以有多个二级索引。

在使用二级索引进行查找数据时,如果查询的数据能在二级索引找到,那么就是「索引覆盖」操作,如果查询的数据不在二级索引里,就需要先在二级索引找到主键值,需要去聚簇索引中获得数据行,这个过程就叫作「回表」

磁盘IO

磁盘处理太慢太慢了

  • 尽量减少 I/O 次数,比如可以使用缓存;
  • 每次 I/O 尽量获取更多的数据;
  • 每次 I/O 尽量获取有用的数据,当然相应的也间接减少总 I/O 次数

总结:

  • 数据存储在磁盘( SSD 跟 CPU 性能也不在一个量级),而磁盘处理数据很慢;
  • 提高磁盘性能主要通过减少 I/O 次数,以及单次 I/O 有效数据量;
  • 索引通过多阶(一个节点保存多个数据,指向多个子节点)使树的结构更矮胖,从而减少 I/O 次数;
  • 索引通过 B+ 树,把业务数据与索引数据分离,来提高单次 I/O 有效数据量,从而减少 I/O 次数;
  • 索引通过树数据的有序和「二分查找」(多阶树可以假设为多分查找),大大缩小查询范围;
  • 索引针对的是单个字段或部分字段,数据量本身比一条记录的数据量要少的多,这样即使通过扫描的方式查询索引也比扫描数据库表本身快的多;

  • 持久性是通过 redo log (重做日志)来保证的;是物理日志,记录做了什么修改

  • 原子性是通过 undo log(回滚日志) 来保证的;
  • 一致性是binlog保证的 ,逻辑日志(有三种格式)statement,row包含操作的具体数据,mixed
  • 隔离性是通过 MVCC(多版本并发控制) 或锁机制来保证的;

死锁问题

处理订单业务时,需要用到select…for update用来避免并发导致的幻读问题,但是这样的话就容易出现死锁

处理方法是破坏形成死锁的条件:打破循环等待条件

  • 设置事务等待锁的超时时间。当一个事务的等待时间超过该值后,就对这个事务进行回滚,于是锁就释放了,另一个事务就可以继续执行了。在 InnoDB 中,参数 innodb_lock_wait_timeout 是用来设置超时时间的,默认值时 50 秒。

  • 开启主动死锁检测。主动死锁检测在发现死锁后,主动回滚死锁链条中的某一个事务,让其他事务得以继续执行。将参数 innodb_deadlock_detect 设置为 on,表示开启这个逻辑,默认就开启。

关于count

  • count(1)、 count()、 count(主键字段)**在执行的时候,如果表里存在二级索引,优化器就会选择二级索引进行扫描。

所以,如果要执行 count(1)、 count(*)、 count(主键字段) 时,尽量在数据表上建立二级索引,这样优化器会自动采用 key_len 最小的二级索引进行扫描,相比于扫描主键索引效率会高一些。

再来,就是不要使用 count(字段) 来统计记录个数,因为它的效率是最差的,会采用全表扫描的方式来统计。如果你非要统计表中该字段不为 NULL 的记录个数,建议给这个字段建立一个二级索引。

如果数据量很大,因为要全表扫描,所以也要花费不短的时间

1.使用explain 出现的rows 字段值就是 explain 命令对表 t_order 记录的估算值。

2.额外表保存记录值

索引失效的情况

  • 当我们使用左或者左右模糊匹配的时候,也就是 like %xx 或者 like %xx% 这两种方式都会造成索引失效;
  • 当我们在查询条件中对索引列使用函数,就会导致索引失效。
  • 当我们在查询条件中对索引列进行表达式计算,也是无法走索引的。
  • MySQL 在遇到字符串和数字比较的时候,会自动把字符串转为数字,然后再进行比较。如果字符串是索引列,而条件语句中的输入参数是数字的话,那么索引列会发生隐式类型转换,由于隐式类型转换是通过 CAST 函数实现的,等同于对索引列使用了函数,所以就会导致索引失效。
  • 联合索引要能正确使用需要遵循最左匹配原则,也就是按照最左优先的方式进行索引的匹配,否则就会导致索引失效。
  • 在 WHERE 子句中,如果在 OR 前的条件列是索引列,而在 OR 后的条件列不是索引列,那么索引会失效。

Original: https://www.cnblogs.com/zz01/p/16488082.html
Author: 山野村夫01
Title: 索引的树结构

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622571/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • NO.4 计算机组成原理-笔记

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月14日
    0119
  • 慢SQL治理方法论

    @ 一、背景 二、发现 三、定位 四、分析 4.1 索引层面分析 4.2 业务层面分析 五、解决 5.1 SQL优化 5.1.1索引优化 5.1.2 子查询优化 5.1.3 分页优…

    数据库 2023年5月24日
    0122
  • leetcode 513. Find Bottom Left Tree Value 找树左下角的值 (简单)

    给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root = [2,1,3]输出: 1 示例 2…

    数据库 2023年6月16日
    0109
  • Spring 学习笔记

    Spring 框架是由于软件开发的复杂性而创建的。Spring 使用的是基本的 JavaBean 来完成以前只可能由 EJB 完成的事情。 Spring 一. Spring Fra…

    数据库 2023年6月11日
    0105
  • 配置nginx只打印延迟超过0.1s和非2XX的accesslog

    背景 当业务accesslog全开时,写入es的qps达到了10W,评估后觉得不太值得,所以考虑抽样打印。查看相关文档后发现目前我们使用的nginx版本不支持抽样打印,所以考虑其他…

    数据库 2023年6月9日
    0123
  • AUFS:多点合一,写时复制

    AUFS(全称:advanced multi-layered unification filesystem,高级多层统一文件系统),用于为 Linux 文件系统实现 联合挂载。提到…

    数据库 2023年6月6日
    0116
  • 一文读懂Redis

    Redis与NoSQL概述 Nosql的优势 使用nosql解决cpu与内存压力 使用nosql解决I/O压力 Nosql数据库的概述 NoSql= Not Only SQL 采用…

    数据库 2023年6月6日
    0135
  • MySQL锁:01.总览

    锁总览 锁的作用 加锁流程 锁对数据库的影响 锁等待 死锁 锁类型 锁范围 锁方式 全局锁 全局读锁 全局QC锁 QC锁存在的问题: 备份锁 backup lock MDL锁 MD…

    数据库 2023年6月16日
    0150
  • Resilience4j 实践

    微服务设计模式 – circuit breaker circuit breaker 熔断器,在很多不同的领域都有这个定义,例如电路里面的熔断器,股票行业里面的熔断,当然…

    数据库 2023年6月11日
    0110
  • B树-插入

    B树系列文章 1. B树-介绍 2. B树-查找 3. B树-插入 4. B树-删除 插入 根据B树的以下两个特性 每一个结点最多有m个子结点 有k个子结点的非叶子结点拥有 k −…

    数据库 2023年6月14日
    0118
  • python logging模块详解

    日志 日志是跟踪软件运行时所发生的事件的一种方法。软件开发者在代码中调用日志函数,表明发生了特定的事件。事件由描述性消息描述,该描述性消息可以可选地包含可变数据(即,对于事件的每次…

    数据库 2023年6月11日
    0118
  • 计算机图形学

    计算机图形学 光追一般指光线追踪。 光线跟踪(也叫ray tracing或者光束投射法)。是一个在二维(2D)屏幕上呈现三维(3D)图像的方法。 BRDF是双向反射分布函数(Bid…

    数据库 2023年6月14日
    096
  • 解决ip和域名都能够ping通但是启动nginx无法访问网页的问题

    解决思路 最近双11逛西部数码的官网看看有没有什么服务器优惠的时候,发现了可以申请一个一块钱用一整年的SSL证书,立马心动下单了,想想俺也可以用 https装装X了哈哈 不过在部署…

    数据库 2023年6月11日
    0249
  • 记一次有意思的业务实现 → 单向关注是关注,双向关注则成好友

    开心一刻 有一个问题一直困扰着我:许仙选择了救蛇,但为什么杨果选择了救鹰(而不是救蛇)。 [En] A question has been bothering me: Xu Xia…

    数据库 2023年5月24日
    0136
  • 程序包javax.persistence不存在解决办法

    只需添加以下包即可 javax.persistence persistence-api 1.0.2 Original: https://www.cnblogs.com/javalo…

    数据库 2023年6月11日
    097
  • Spring Boot中异步请求和异步调用

    一、SpringBoot中异步请求的使用 1、异步请求与同步请求 特点: 可以先释放容器分配给请求的线程与相关资源,减轻系统负担,释放了容器所分配线程的请求,其响应将被延后,可以在…

    数据库 2023年6月14日
    0118
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球