首页 > 数据库 >mysql的索引

mysql的索引

时间:2024-09-25 23:20:43浏览次数:9  
标签:记录 查询 回表 索引 InnoDB mysql 主键

InnoDB是mysql的默认引擎,索引原理是B+树。

InnoDB的索引方式

首先,数据库的目录也是很庞大的,不能放在内存里。

而磁盘的读写速度是比内存慢几个数量级。

而且顺序读一块比随机I/O划算,也就是局部性原理。

所以:InnoDB把数据和目录都放在默认大小16KB的数据页中。每次读都读一个页。

每个数据页是怎么组织呢?

每个页除了首部和底部的其他额外信息。其他的都是行记录。

每条行记录的格式为:next_record|其他信息|实际行信息。

所以就是以单向链表的形式组织着行记录。按主键排序。

(所以用自增主键更好维护,加到列表最后就可以)

为了折中 高效查询增删记录的维护的低成本

InnoDB把 4~8 条记录作为一组,每组的最大主键的记录作为组长,保存小组的记录数量来维护个数(分裂合并)

把所有组长的主键和位置有序保存到一个数组中。称为槽。

所以根据槽可以二分快速查到小组,再遍历到具体记录。

这样查询高效,也不用每次都维护槽数组,只有小组数量太大太小分裂合并时重新维护数组。

页间的组织方式

每个数据页中还要两条伪记录,是记录链表的头和尾,分别保存着主键的 最小值 和 最大值。

所有叶子节点(数据页)都是这么保存记录的,所以需要目录来快速的找到页。

目录也是很大的,也是同样用行记录组织在数据页中。

为了目录页的存的行数据更多,行数据只用保存主键和数据页的索引,这样树的高度更小,这也是B+树和B树的区别。

一般的B+树不超过4层。

一个目录页大约1000条记录(8字节(主键)+6字节(页指针)= 14字节),三层目录,有大约10^9条目录记录,所以可以有这么多叶子节点(数据页16KB)。所以是16TB的容量。

(64TB 的数据容量是 InnoDB 通过使用溢出页和灵活的存储机制来实现的,特别是处理 BLOBTEXT 类型的大字段时,它们会占用额外的磁盘空间,从而使总数据容量扩展到 64TB。)

总结InnoDB的主索引

B+树更像是一种逻辑上树,每块目录页读后可以快速的解析。

主要是不超过4层的高度,让引擎只用在磁盘读不超过4次,而且可以范围查询。

主索引这样的也就是聚簇索引(记录和索引在一起)。

二级索引

根据上面的主索引的方法,我们可以看到,如果要按其他列查询只能遍历所有数据查询。

所有我们可以更加其他列建立新的辅助索引(或者几列,叫做联合索引)。

用 二级索引列 ,排序,建立新的B+树,记录只用保存对应主键。

根据 二级索引列 查询到 主键 ,再用主键到主索引里查询记录,这叫回表

回表查询是随机I/O,(局部性原理没啥用了)

所以能不回表尽量不回表。

必须回表就减少回表次数。

优化

主要就是减少回表:

  • 索引覆盖:在二级查询的时候,前缀查询是有效的,联合索引可以查到可能需要的值,就不用回表了。

  • 索引下推:在二级索引中使用,当条件不完全依赖于索引时,它会尽量在索引扫描的过程中对其他列进行过滤(比如查询 SELECT * FROM employees WHERE age = 30 AND name LIKE 'J%';),减少回表操作。

标签:记录,查询,回表,索引,InnoDB,mysql,主键
From: https://blog.csdn.net/m0_62494327/article/details/142535546

相关文章

  • MYSQL的安装与卸载
    1安装1.进入官网下载想要的mysql版本2.双击之后会出现如下图所示界面,询问是否同意,将我同意的选框勾选上,然后点击next,如下:3.选择自定义安装,点击下一步4.根据电脑配置选择要安装的MySql版本,然后点击next5.如果出现当前界面,则可以配置安装目录,如果出现的不是这个界面请......
  • MYSQL-约束
    1-limit语句limit的作用是限制查询记录的条数格式如下select*from表名limitoffset,row_count;举例select*fromtablelimit 1,4;这里的1指的是从第二行数据开始,1就是索引(索引从0开始),4指的是查询记录条数,也就是从第二条(行)开始,一共查询四条记录,到第五条(行)如......
  • MySQL高阶1965-丢失信息的雇员
    目录题目准备数据分析数据实现题目编写解决方案,找到所有 丢失信息 的雇员id。当满足下面一个条件时,就被认为是雇员的信息丢失:雇员的 姓名 丢失了,或者雇员的 薪水信息 丢失了返回这些雇员的id employee_id , 从小到大排序 。准备数据CreatetableIfNot......
  • Mongodb 常见操作:查询,排序,查看索引,创建索引等
    //insertdb.books.insert([{_id:12,item:"pencil1",qty:51,type:"no.1"},{_id:21,item:"pencil1",qty:52,type:"no.2"},{_id:31,item:"pencil1",qty:53,type:"no.3"},])db.b......
  • 快速部署MySQL数据库
    一.下载对应的软件版本下载地址:http://mirrors.sohu.com/mysql/MySQL-5.6/备用地址:http://ftp.ntu.edu.tw/pub/MySQL/Downloads/[root@localhost~]#wget-qhttp://mirrors.sohu.com/mysql/MySQL-5.6/sql-5.6.36-linux-glibc2.5-x86_64.tar.gz二、解压、配置用户和权限[root@loca......
  • mysql优化之sql语句优化、以及mysql一些高频面试题
    文章目录一、索引1、什么是索引2、添加索引的原则3、索引的优缺点4、索引分类5、mysql存储过程(方法)二、MySQL的逻辑架构1、逻辑架构2、MyISAM和InnoDB的区别三、mysql的索引数据结构1、BTree2、B+Tree四、缓冲池BufferPool1、预读机制2、预读失效3、淘汰策略五......
  • mysql数据库 - anolisos安装
    文章目录一、anolisos系统介绍1.1、anolisos系统的起源1.2、anolisos系统的版本支持1.3、anolisos系统的特点1.4、anolisos系统的适用场景二、环境部署2.1、修改主机名2.2、修改静态ip地址2.3、关闭selinux2.4、关闭或放通防火墙端口三、安装mysql数据库3.1、更新yum源......
  • Flutter 自定义国家选择器:基于 A ~ Z字母索引的列表跳转与侧边栏导航实现
    在许多移动应用中,我们经常需要通过字母索引快速跳转到目标位置,比如通讯录、国家选择等功能。这篇博客将带大家实现一个仿照通讯录的Flutter国家选择器。通过一个字母索引的侧边栏,用户可以快速跳转到目标字母分组。效果:1.项目需求与设计思路我们需要实现一个包含多个国......
  • Linux常用命令(Mysql)
    --删除表内数据(Mysql)usedc;#切换到待删除表所在的数据库truncatetable[表名]#删除表--数据库导入SQL文件数据(Mysql)sourcea.sql;--SQL增删改查insertintostudent(id,name,sex,birth)values('01','赵雷','男','1990');deletefromstudentwhereid=......
  • 大数据-137 - ClickHouse 集群 表引擎详解2 - MergeTree 存储结构 一级索引 跳数索引
    点一下关注吧!!!非常感谢!!持续更新!!!目前已经更新到了:Hadoop(已更完)HDFS(已更完)MapReduce(已更完)Hive(已更完)Flume(已更完)Sqoop(已更完)Zookeeper(已更完)HBase(已更完)Redis(已更完)Kafka(已更完)Spark(已更完)Flink(已更完)ClickHouse(正在更新···)章节内容上节我们完成了如下的内容:表引擎详解介绍日志......