读书笔记-MySQL运维内参08-索引实现原理1

B树和B+树的区别

1,B树的叶子节点和内节点存在的都是数据行的所有信息,B+树的内节点值存放键(索引)信息,数据都在叶子节点上。

2,由于B树键和值的所有信息,所以每页的存储的数据行相对较少,随数据发展,该树发成为一个高瘦的树;相反,B+树的内节点只存放键值,所以会成为一个矮胖的树。所以就搜索而言,B+树的效率比B树的效率要高。

3,B树的查询效率和所查的键在B树种的位置有关;而B+树的复杂度对于某个B+树来说是固定的。

4,B树整体而言相对B+树可以节省存储空间,但是插入删除的复杂度明显增加,而且性能不平衡(有时很快能找到合适位置,有时需要消耗大量的IO)。而B+树是一种很好的折中方案。查询过程稳定,插入删除操作一般最多也是进行一次分裂(合适的位置的节点存储慢了,需要分裂)。

5,B树种所有的数据只存储一次。B+树种除了叶子节点存储所有数据以外,还需要内节点存储键的数据。所以在占用空间方面,B+树的方式比B树占用空间要多一些,但是B+树的方式提升了整体性能。

索引的设计

影响计算机任务的三个因素:内存、处理器和磁盘的速度。

磁盘的性能与读写顺序有关,顺序读写比随机读写要快得多。

索引设计存储方式:

1,将磁盘空间或文件划分未许多大小相同的块或页,每个块可以存储多个行。

2,在一个块内,数据通过链表或者数组的方式来进行组织管理。

3,在一个块内,所有的数据也是按照键值排序的,可以通过经典的二分查找快速定位到相应的数据行。

4,通过块来承载数据,通过B+树来组织不同的块之间的关系。

5,通过内节点的键值和一个位置信息、内节点和下层节点或者叶子节点的指针,可以很方便的找到该内节点的子节点。

聚集索引和二级索引

存储所有数据的索引成为聚集索引,聚集索引的顺序是按照主键(可以是Rowid或者自增ID或者用户设置的其他主键)排序。

回表,二级索引上的数据列不能全部覆盖锁需要的查询,这就需要通过二级索引的指针查找到聚集索引。

聚集索引的结构:

索引结构:[主键列][TRXID][ROLLPTR][其他建表时创建的非主键列]

参与记录比较的列:主键列

内节点Key列:[主键列]+pageno指针

注意:上面所说的主键,若用户有定义主键就是指用户定义的主键;否则是系统给的不可见的主键(Rowid)

二级索引的结构

索引结构:[索引列][主键列]

参与记录和比较的列:[索引列][主键列]

内节点的key列:[索引列][主键列]+pageno

神奇的B+树网络

时间: 2024-10-22 17:26:07

读书笔记-MySQL运维内参08-索引实现原理1的相关文章

读书笔记-MySQL运维内参08-索引实现原理2

我们已经知道B+树的组织结构及不同层之间是如何关联的了. 现在我们模拟一个B+树是如何从小到大,从无到有,从简到繁的过程. 首先我们来做一些假设: 1,每个页面包括内节点和叶子节点最多可以插入三条记录,插入第四条的时候,就会导致分裂. 2,插入的数据是键值对,但是我们只关注键,值可以不用关注,就简单的以data表示. 3,插入数据序列为:10,20,5,8,23,22,50,21,53,40,9 4,为了简明一些,key就是一些简单的int类型的数字 5,假设根节点的页面号是100 第一次插入过

读书笔记-MySQL运维内参07-InnoDB数据存储结构

表空间文件组成结构 InnoDB存储引擎按照表空间进行管理. 在新建一个数据时,InnoDB存储引擎会初始化一个名为ibdata1的表空间文件. 默认情况下,这个文件会存储所有表的数据,以及我们所熟知但是看不到的SYS_TABLES, SYS_COLUMNS, SYS_INDEXES, SYS_FIELDS等. 此外,还用来存储保证数据完整性的的回滚端数据. 可以通过设置InnoDB_file_per_table来设置,使得每一个表都对应一个独立的表空间文件. 段 段是表空间文件的主要组织结构,

公司没有 DBA,Mysql 运维自己来

目录   一.虚拟机部署  二.基本运维  三.配置  四.常见问题  五.脚本  参考资料 如果你的公司有 DBA,那么我恭喜你,你可以无视 Mysql 运维.如果你的公司没有 DBA,那你就好好学两手 Mysql 基本运维操作,行走江湖,防身必备. 环境:CentOS7 版本: 一.虚拟机部署 本文仅介绍 rpm 安装方式 安装 mysql yum 源 官方下载地址:https://dev.mysql.com/downloads/repo/yum/ (1)下载 yum 源 $ wget ht

mysql运维必会的一些知识点整理

(1)基础笔试命令考察 1.开启MySQL服务 /etc/init.d/mysqld start service mysqld start systemctl start mysqld 2.检测端口是否运行 lsof -i :3306 netstat -lntup |grep 3306 3.为MySQL设置密码或者修改密码 设置密码 mysql -uroot -ppassword -e "set passowrd for root = passowrd('passowrd')" mys

搭建稳固的MySQL运维体系

本课时主要包含 MySQL 监控要点.MySQL SQL 审核执行.MySQL 备份恢复等内容. MySQL 监控要点 首先我们来学习 MySQL 监控要点,主要涉及服务器和 MySQL 两个方向的监控告警. 在这两个监控告警方向需要重点关注监控策略.监控趋势图及报警方式. 监控策略指的是每个监控项的告警阈值,例如 threads_running > 30 触发报警. 监控趋势图指的是对每个时间点,项目所采集数据的图形展现,基于历史数据的比对能够快速发现异常的监控项. 报警方式则按需配置,Ema

51CTO学习笔记--Linux运维故障排查思路与系统调优技巧视频课程(高俊峰)

51CTO学习笔记--Linux运维故障排查思路与系统调优技巧视频课程 第一课 Linux运维经验分享与思路 1.一般把主机名,写到hosts下    127.0.0.1    hostname,因为很多应用要解析到本地.oracle没有这个解析可能启动不了. 2.注释掉UUID以及MAC地址,需要绑定网卡的时候,这个可能会有影响. 3.磁盘满了无法启动,  var下木有空间,无法创创建PID等文件,导致文件无法启动,按e   进入single  然后b  重启进入单用户模式. 4.ssh登陆系

mysql 运维常见操作

初始安装并赋予密码: [[email protected] html]# yum install -y mysql mysql-server                         #安装mysql可与段与服务器端 [[email protected] ~]# /usr/bin/mysqladmin -u root password "gslixiong"         #赋予root管理员密码! 进入数据库更改密码,并解决密码复杂度: mysql> set globa

MySQL运维-多实例部署

MySQL多实例是在同一台数据库服务器上,通过开启多个不同的服务端口,并被对应的socket监听,以实现同时运行多个MySQL服务进程的目的. 实验环境使用<MySQL运维-单实例安装>部署成功后的实验环境mysql实例1安装目录:/data/3306mysql实例1数据文件目录:/data/3306/dbfilemysql实例2安装目录:/data/3307mysql实例2数据文件目录:/data/3307/dbfile 停止MySQL []# service mysqld stopShut

MySQL运维-3,多实例控制脚本的编写与使用

实验环境此文章在<MySQL运维-2,多实例部署>后,所用环境也是上一篇实验部署成功后的实验环境. 使用方法1,编写脚本,命名为mysqld,让其有执行权限2,拷贝mysqld到不同实例的目录中 []# tree -L 2 /data/ /data/ ├── 3306 │?? ├── dbfile │?? ├── my.cnf │?? └── mysqld └── 3307 ├── dbfile ├── my.cnf └── mysqld 3,修改mysqld中的端口,让其与所属实例相同4,带