索引的树结构

二分查找

二叉树

二叉平衡树

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

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

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

聚簇索引和非聚簇索引

如果叶节点存储的实际数据是聚集索引,则一个表只能有一个聚集索引;如果叶节点存储的不是实际数据,但主键值是辅助索引,并且一个表中可以有多个辅助索引。

[En]

If the leaf node stores the actual data is a clustered index, a table can only have one clustered index; if the leaf node stores not the actual data, but the primary key value is the secondary index, and there can be multiple secondary indexes in a table.

当使用二级索引查找数据时,如果在二级索引中可以找到查询到的数据,那么这就是“索引覆盖”操作。如果查询的数据不在二级索引中,则需要先在二级索引中找到主键值。如果您需要获取聚集索引中的数据行,则此过程称为“返回表”。

[En]

When using the secondary index to find data, if the queried data can be found in the secondary index, then it is the “index overwrite” operation. If the queried data is not in the secondary index, you need to find the primary key value in the secondary index first. If you need to get the data rows in the clustered index, this process is called “returning to the table”.

磁盘IO

磁盘处理太慢太慢了

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

总结:

  • 数据存储在磁盘( SSD 跟 CPU 性能也不在一个量级),而磁盘处理数据很慢;
  • 提高磁盘性能主要通过减少 I/O 次数,以及单次 I/O 有效数据量;
  • 索引通过多阶(一个节点保存多个数据,指向多个子节点)使树的结构更矮胖,从而减少 I/O 次数;
  • 索引通过 B+ 树,把业务数据与索引数据分离,来提高单次 I/O 有效数据量,从而减少 I/O 次数;
  • 该索引通过对树数据进行排序和“二分查找”(多序树可假定为多部分搜索),大大缩小了查询范围。
    [En]

    the index greatly reduces the scope of the query through the ordering of tree data and “binary search” (multi-order trees can be assumed to be multi-part search).*

  • 索引针对单个字段或部分字段,数据量本身远小于一条记录,因此扫描查询索引比扫描数据库表本身要快得多。

    [En]

    the index is aimed at a single field or part of the field, and the amount of data itself is much less than that of a record, so that querying the index by scanning is much faster than scanning the database table itself.*

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

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

死锁问题

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

应对的办法是摧毁形成僵局的条件:打破循环,等待条件。

[En]

The way to deal with it is to destroy the conditions that form a deadlock: break the cycle and wait for conditions.

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

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

关于count

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

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

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

如果数据量很大,则需要很长时间,因为需要进行全表扫描。

[En]

If the amount of data is large, it will take a long time because the full table scan is required.

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

2.额外表保存记录值

索引失效的情况

  • 当我们使用左或者左右模糊匹配的时候,也就是 like %xx 或者 like %xx% 这两种方式都会造成索引失效;
  • 在查询条件中对索引列使用函数时,会导致索引失败。
    [En]

    when we use functions on index columns in query conditions, it will cause the index to fail.*

  • 当我们计算查询条件中索引列的表达式时,也不可能遍历索引。
    [En]

    when we evaluate the expression of the index column in the query condition, it is also impossible to walk the index.*

  • MySQL 在遇到字符串和数字比较的时候,会自动把字符串转为数字,然后再进行比较。如果字符串是索引列,而条件语句中的输入参数是数字的话,那么索引列会发生隐式类型转换,由于隐式类型转换是通过 CAST 函数实现的,等同于对索引列使用了函数,所以就会导致索引失效。
  • 如果联合索引能够正确使用,则需要遵循最左边的匹配原则,即按照最左边的优先级匹配索引,否则会导致索引失败。
    [En]

    if the federated index can be used correctly, it needs to follow the leftmost matching principle, that is, to match the index according to the leftmost priority, otherwise it will cause the index to fail.*

  • 在 WHERE 子句中,如果在 OR 前的条件列是索引列,而在 OR 后的条件列不是索引列,那么索引会失效。

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

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

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

(0)

大家都在看

  • redis启动服务闪退,端口被占用

    1、首先查询一下redis端口的pid,使用命令【netstat -ano | findstr 端口号】redis默认端口号是6379 (注意!如果netstat命令使用不了的话,…

    数据库 2023年6月11日
    0156
  • 分享封装好的异步Mysql动态的库(DyNetMysql.dll) + 项目源码

    在做C++项目时,经常会用到Mysql数据库,Mysql接口提供给我们的数据是相当原始的,如:字段名、字段类型,字段长度等等,一般情况我们都想一种更方便获得数据 如: XXXStr…

    数据库 2023年6月14日
    0116
  • MySQL数据库CRUD

    INSERT语句 INSERT INTO 表名 (column1,column2,column3,…)VALUES (value1,value2,value3,&#82…

    数据库 2023年5月24日
    0109
  • chrome架构发展与提供的性能分析工具

    谷歌早期多进程架构分为插件进程(Plugin Process)、渲染进程(Render Process)、浏览器主进程(Browser Process) 插件进程负责插件的运行,通…

    数据库 2023年6月6日
    0361
  • MySQL学习笔记

    MySQL学习笔记 解决MYSQL中文乱码问题 一、乱码的原因: 1、 client客户端的编码不是utf8 2、server端的编码不是utf8 3、database数据库的编码…

    数据库 2023年6月14日
    0145
  • gitlab-runner浅谈——【此作业已阻塞,因为该项目没有分配任何可用Runner】解决方法

    作为gitlab的初学者,只能简单记录下自己遇到的问题。不求甚解 安装 下载最新的二进制文件 (参考官网) Download the binary for your system …

    数据库 2023年6月11日
    0223
  • DRF补充数据库异常和Redis异常

    DRF补充数据库异常和Redis异常 (1)在项目适当位置新建exceptions.py,内容如下: from rest_framework.views import except…

    数据库 2023年6月14日
    0100
  • Matery主题自定义(一)黑夜模式

    黑夜模式 作为一个前端学习者,自然懂得黑夜模式的重要性,可惜主题原生未提供,那就自己弄吧 参考其他优秀产品的黑夜模式,得出共性: 那就是黑夜模式的背景一般不会是纯黑(#000);而…

    数据库 2023年6月16日
    0112
  • Dubbo源码(八)-负载均衡

    前言 本文基于Dubbo2.6.x版本,中文注释版源码已上传github:xiaoguyu/dubbo 负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)…

    数据库 2023年6月11日
    0135
  • MySQL MHA 运行状态监控

    一 项目描述 1.1 背景 MHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failo…

    数据库 2023年6月16日
    0175
  • 翻译官方文档或文章小姿势

    翻译官方文档或文章小姿势 首先抛出一个观点: 不太建议初学者翻译官方文档或文章 这个观点针对的是”初学者”,如果是老鸟并且业余时间很多,请绕行 :-) 第一…

    数据库 2023年6月9日
    0120
  • 十一章 配置文件参数化

    把Spring配置文件中需要经常修改的字符串信息,转移到一个更小的配置文件中 1. 小配置文件(.properties) 2. 好处 : 利于维护 1.配置文件参数化开发步骤 已数…

    数据库 2023年6月14日
    0110
  • 希望腿上的伤快点好

    明天去星巴克泡一会儿想把一些课程关联到的课程学习一下 Original: https://www.cnblogs.com/ukzq/p/16747859.htmlAuthor: D…

    数据库 2023年6月11日
    0131
  • 如何构建你自己的计算机网络知识体系?

    大家好,我是小牛肉,不知道各位曾经有没有和我一样的困惑,就是有些知识好像已经看了好多遍了,但是知识点在脑子中是分散的,没办法串联起来,别人问一个问题我能答出来一点,但是你让我自己从…

    数据库 2023年6月6日
    0127
  • 链表的知识总结

    链式结构内存不连续的,而是一个个串起来的,每个链接表的节点保存一个指向下一个节点的指针。 ⭐ 链式结构包含:node(节点)还有value(值),由于内存不连续的,那么对于数据的插…

    数据库 2023年6月16日
    0137
  • 890.查找和替换模式

    你有一个单词列表 words 和一个模式 pattern,你想知道 words 中的哪些单词与模式匹配。 如果存在字母的排列 p ,使得将模式中的每个字母 x 替换为 p(x) 之…

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