索引的常见模型

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

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

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

二叉搜索树:树层数可能很高,可能一个节点上的数据在一个物理数据块上,那么访问叶子节点的数据需要大量磁盘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. git 访问方式浅谈

    小小总结下git的访问方式,留爪. git访问方式简介 https:每次fetch/push/pull都需要输入username & password ssh:通过ssh-keygen生成的公 ...

  2. DeepSeek 聊天机器人项目

    想要更深入玩转聊天机器人开发? 推荐本文档 + 课程<DeepSeek 聊天机器人项目>一起学习,效果翻倍! 边学边练,轻松打造智能对话系统~ (๑•̀ㅂ•́)و✧ 快上车,AI 之旅发车 ...

  3. 《机器人SLAM导航核心技术与实战》第1季:第9章_视觉SLAM系统

    <机器人SLAM导航核心技术与实战>第1季:第9章_视觉SLAM系统 视频讲解 [第1季]9.第9章_视觉SLAM系统-视频讲解 [第1季]9.1.第9章_视觉SLAM系统_ORB-SLA ...

  4. Model Context Protocol

    MCP is an open protocol that enables AI models to securely interact with local and remote resources ...

  5. GStreamer开发笔记(一):GStreamer介绍,在windows平台部署安装,打开usb摄像头对比测试

    前言   当前GStreamer是开源的多媒体框架,其适配后可以支持板卡的硬编码.硬解码,还提供RTSP服务器等功能,降低了音视频开发的门槛(转移到gstreamer配置和开发上了,但是跨平台),瑞芯 ...

  6. Codeforces Round 1016 (Div. 3)题解

    题目地址 https://codeforces.com/contest/2093 锐评 在所有题意都理解正确的情况下,整体难度不算太难.但是偏偏存在F这么恶心的题意,样例都不带解释一下的,根本看不懂题 ...

  7. Python科学计算系列10—数论

    1.常用操作 代码如下: # coding=utf-8 from sympy import * from sympy.ntheory.modular import solve_congruence, ...

  8. 详细介绍MessageQueueSelector

    一.MessageQueueSelector 详解 MessageQueueSelector 是 RocketMQ 提供的一个接口,用于自定义消息发送时的队列选择策略. 通过实现该接口, 开发者可以控 ...

  9. git版本管理库运用

    一.git 删除本地创建的仓库连接 //删除文件夹下的所有 .git 文件 find . -name ".git" | xargs rm -Rf 二.git命令:全局设置用户名邮箱 ...

  10. python获取日期(今日、昨日),及格式化日期的方法(datetime)

    在写爬虫的过程中发现,很多网站的信息均以当天日期为链接组成部分,但是格式又不相同 有些是20210328,有些是2021-03-28,还有些2021/03/28 如果一次爬取来源不同网站的信息,需要对 ...