索引的常见模型

实现索引的方式有很多种,这里先介绍三种常见结构:哈希表、有序数组和搜索树。

哈希表:只适用于只有等值查询的场景。

有序数组:在等值查询和范围查询场景中的性能都非常优秀,但是在更新数据的时候需要挪动大量记录。因此,只适用于静态存储引擎

二叉搜索树:树层数可能很高,可能一个节点上的数据在一个物理数据块上,那么访问叶子节点的数据需要大量磁盘IO。

为了让一个查询尽量少进行磁盘IO,使用N叉树代替二叉树。

数据库技术发展至今,跳表、LSM树等结构也被用于引擎设计中。需要明白的是,数据库底层存储的核心就基于数据模型,因此每碰到一个新数据库,需要先关注它的数据模型,这样才能从理论上分析出这个数据库的适用场景。

InnoDB的索引模型

在InnoDB中,表都是根据主键顺序以索引的形式存放的。由于InnoDB使用了B+树索引模型,所以数据都是存储在B+树中的。

每一个索引在InnoDB里对应一棵B+树。

根据叶子节点的内容,索引类型分为主键索引和非主键索引:

  • 主键索引的叶子结点存的是整行数据。在InnoDB里,主键索引也被称为聚簇索引。

  • 非主键索引的叶子结点存的是主键的值。在InnoDB里,非主键索引也被称为二级索引。

对于非主键索引,假设查询select *,那么需要先查询非主键的索引树,得到主键后再查询一次,这个过程称为回表。因此,应该尽量使用主键查询。

索引维护

B+树为了维护索引有序性,在插入新值时候需要做必要的维护。如果插入时所在的数据页已满,根据B+树的算法,这时候需要申请一个新的数据页,然后挪动部分数据过去,这个过程称为页分裂,会对性能造成较大影响。同时,页分裂还影响数据页的利用率,原本放在一个页的数据,分到两个页中,整体空间利用率降低大约50%。

页分裂的逆过程为页合并。当相邻两个页由于删除了数据,利用率很低之后,会将数据页做合并。

基于索引维护,讨论哪些场景应该使用自增主键,哪些情况不应该用。

当我们设置了自增主键,插入时可以不指定主键值,且插入符合递增插入,每次插入都是一次追加操作,不会挪动其他记录,也不会触发叶子结点的分裂。而以有业务逻辑的字段做主键,往往保证不了有序插入,这样就可能有页分裂。

除了考虑性能,从存储空间的角度来看,自增主键的字节数也往往较小,那么普通索引的叶子节点就会越小,占用的空间也会越小。

因此,从性能和存储空间角度,自增主键往往是更合理的选择。而有些业务场景,比如要求只有一个唯一索引,那么该索引列自然作为主键了。

参考资料:极客时间专栏《MySQL实战45讲》https://time.geekbang.org/column/intro/100020801?tab=catalog

MySQL 04 深入浅出索引(上)的更多相关文章

  1. MySQL创建高性能索引

    参考<高性能MySQL>第3版 1 索引基础 1.1 索引作用 在MySQL中,查找数据时先在索引中找到对应的值,然后根据匹配的索引记录找到对应的数据行,假如要运行下面查询语句: 如果在u ...

  2. Mysql实战45讲 04讲深入浅出索引(上)读书笔记 极客时间

    极客时间 Mysql实战45讲 04讲深入浅出索引 极客时间(上)读书笔记  笔记体悟 1.索引的作用:提高数据查询效率2.常见索引模型:哈希表.有序数组.搜索树3.哈希表:键 - 值(key - v ...

  3. MySQL 笔记整理(4) --深入浅出索引(上)

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> 4) --深入浅出索引(上) 一句话简单来说,索引的出现其实就是为了提高数据查询的效率,就像书的目录一样. 索引的常见模型 哈希表: ...

  4. 深入浅出之mysql索引--上

    当着小萌新之际,最近工作中遇到了mysql优化的相关问题,然后既然提到了优化,很多像我这样的小萌新不容置喙,肯定张口就是 建立索引 之类的. 那么说到底,索引到底是什么,它是怎么工作的?接下来就让我和 ...

  5. Mysql实战45讲 05讲深入浅出索引(下)极客时间 读书笔记

    极客时间 Mysql实战45讲 04讲深入浅出索引(下)极客时间 笔记体会: 回表:回到主键索引树搜索的过程,称为回表覆盖索引:某索引已经覆盖了查询需求,称为覆盖索引,例如:select ID fro ...

  6. MySQL 笔记整理(5) --深入浅出索引(下)

    笔记记录自林晓斌(丁奇)老师的<MySQL实战45讲> 5) --深入浅出索引(下) 这次的笔记从一个简单的查询开始: 建表语句是这样的 mysql> create table T ...

  7. [Linux] Ubuntu Server 12.04 LTS 平台上搭建WordPress(Nginx+MySql+PHP) Part II

    接着上一节继续搭建我们的LNMP平台,接下来我们安装PHP相关的服务 sudo apt-get install php5-cli php5-cgi php5-fpm php5-mcrypt php5- ...

  8. [Linux] Ubuntu Server 12.04 LTS 平台上搭建WordPress(Nginx+MySQL+PHP) Part IV

    接下来我们去下载 WorePress 用最新的 3.7.1 下载地址是:http://cn.wordpress.org/wordpress-3.7.1-zh_CN.zip 我们先建立一个文件夹 /va ...

  9. 图解MySQL索引(上)—MySQL有中“8种”索引?

    关于MySQL索引相关的内容,一直是一个让人头疼的问题,尤其是对于初学者来说.笔者曾在很长一段时间内深陷其中,无法分清"覆盖索引,辅助索引,唯一索引,Hash索引,B-Tree索引--&qu ...

  10. NULL在oracle和mysql索引上的区别

    一.问题 oracle的btree索引不存储NULL值,所以用is null或is not null都不会用到索引范围扫描,但是在mysql中也是这样吗? 二.实验 先看看NULL在oracle(11 ...

随机推荐

  1. 虚拟机为什么ping不通主机

    在虚拟机里各种操作都正常.就是ping不通主机.为什么? NAT模式下(网络地址转换模式),虚拟机后网络适配器就会出现VMnet8网卡: 把VMnet8的ip4设定成你主机同段IP.这个VMnet8地 ...

  2. Python 潮流周刊#97:CUDA 终于原生支持 Python 了!(摘要)

    本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...

  3. 🎀截图工具推荐-Snipaste

    简介 Snipaste 是一款非常强大且免费的截图和屏幕标记工具,由一位来自中国的开发者开发.它以其简洁的界面和丰富的功能而受到广泛好评. 官网 https://zh.snipaste.com/ Sn ...

  4. 🎀idea-java序列化serialversionUID自动生成

    简介 java.io.Serializable 是 Java 中的一个标记接口(marker interface),它没有任何方法或字段.当一个类实现了 Serializable 接口,那么这个类的对 ...

  5. 在MaxKB中实现准确的Chat TO SQL(BI)

    主要面向考试成绩管理系统(目前支持旭日图.仪表盘柱状图.桑基图.漏斗图.河流图.数据聚合图.散点图.南丁格尔玫瑰图.饼状图.环形图.堆叠柱状图.堆叠折线图.堆叠面积图.面积图.折线图) 主要思路: 第 ...

  6. 根据返回值,判断是否执行下一步的方法(Run Keyword And Return Status指令的使用)

    场景分析: 上图"通用模版测试"内容 满足,如果当前页面存在这条数据,即结束执行本条用例,自动执行下一条.如果没有,则调用新建模版关键字,执行新建模版. 脚本如下 1配置运费模版 ...

  7. gRPC与RPC的差异

    在微服务架构日益流行的今天,远程过程调用(RPC)技术成为连接各个服务的重要桥梁.本文将详细比较传统RPC与谷歌开发的gRPC框架,通过具体示例展示它们在请求处理.数据格式.性能等方面的差异. 基本概 ...

  8. jmeter之请求体类型

    一.当post方法的提交数据类型(content-type)为multipart/form-data,请求体为文件文件上传. fiddler抓包请求体的name对应jmerter文件上传的参数名称,f ...

  9. .NET CORE API接口的分组、版本管理

    参照: Asp.net Core的Swagger接口根据模块.版本分组 (bbsmax.com)

  10. ESP32教程:通过WIFI控制LED灯的开关

    LED闪烁 在通过WIFI控制LED灯的开关之前,我们先实现一下LED闪烁. 接线图: 来源:https://esp32io.com/tutorials/esp32-led-blink 我的接线图: ...