文档章节

mysql 数据和索引的存储关系

dev_chao
 dev_chao
发布于 2017/03/26 18:16
字数 1121
阅读 5
收藏 0

本文转自:http://blog.csdn.net/tangkund3218/article/details/46945311

关系型数据库都有索引的概念,那么索引和数据库真实数据在磁盘中都是一种什么样的存储结构呢。这篇文章让我们一起来探讨下。

MySQL是目前市面上比较成熟的关系型数据库,阿里集团目前都是mysql作为db存储(支付宝目前在推oceanbase),就拿它来做例子介绍吧。

先介绍几个基础概念:  

1).  什么是索引? 

高性能mysql一书上对索引的解释是,"索引是存储引擎用于快速找到记录的一种数据结构". 

理解索引最简单的办法就是去看一看一本书的"索引"(目录)部分. 通过找到目录中对应的特定主题的页码,可快速定位到你要找的主题.

mysql中也一样,数据查找时,先看看查询条件是否命中某条索引,符合则通过索引找到相关数据返回,不符合则需要全表扫描,找到与条件符合的行返回.

 

2).  存储引擎

mysql的存储引擎主要有如下几种:

innodb, MyISAM,Archive,Blackhole,CSV,Federated,Memory,Merge,NDB.

另外mysql还支持一些第三方存储引擎: OLTP , 列存储引擎Infobright , 社区存储引擎Aria等

上面的每一种存储引擎在不同的场景下有不同的作用, mysql老版本的默认存储引擎是MyIsam.但l在5.5以后默认的存储引擎已经从MyISAM改为Innodb了.

MyISAM 和 Innodb的主要区别有2个: 

MyISAM 不支持事务, Innodb支持.

MyISAM是表锁,   Innodb是行锁.

当然存储引擎不一样,那么索引的实现方式也就不一致. 

如果没做特殊说明,我们提到的mysql存储引擎指的都是Innodb 引擎, 索引都指的是B+Tree索引.

 

本文要讨论什么? 

假设有一张表test, 它的字段和数据如上图.  id 是主键, money字段上建了b-tree索引, 那么上图中的数据和索引在磁盘中是如何存储的是本文的讨论重点.

因为id是主键.存储引擎会默认为主键建主键索引, 非主键的索引money称为二级索引.

 innodb的主键索引都是聚簇索引,聚簇索引把数据行放在索引数据结构的叶子节点上,一个表只能有一个聚簇索引. 如果没有主键, Innodb会选择一个唯一的非空索引代替,如果没有这样的索引,Innodb会隐含的定义一个主键来作为聚簇索引.

首先我们看看聚簇索引在磁盘中的存储方式,如下图: 

注意:  上图中非叶子节点只保存了索引列,叶子节点保存了索引列和数据行.

 

聚簇索引的优点如下:

1, 数据访问更快, 聚簇索引把数据和索引保存在同一个tree中,索引命中即意味中数据全部命中.

2, 使用覆盖索引的扫描的查询可以直接使用页节点中的主键值.

缺点如下:

1, 聚簇索引最大限度的提高了I/O密集型应用的性能.

2, 插入速度严重依赖插入顺序.

3, 更新聚簇索引列的代价很高,因为需要移位.

4, 插入新数据时,或者主键裂需要移动的时候,可能面临“页分裂”.

5, 非聚簇索引(二级索引)包含了聚簇索引,如果聚簇索引较大,二级索引也会很大(二级索引的叶子节点包含了主键列的值). 

 

那么二级索引列 money的存储结构又是怎么样的呢?

截图来自《高性能mysql第三版》

 

可以看出,innodb的二级索引是直接在叶子节点存储了聚簇索引的值.

二级索引的叶子节点保存的不是指向行的物理位置指针,而是行的主键值.这样行的在面临页分裂时,不需要单独维护二级索引.

而MyISAM存储引擎则是主键索引和其它二级索引一样都指向了行数据.

经过上面的讨论,我们应该大致清楚了,mysql表里的数据是如何在磁盘中存储的。

本文转载自:http://blog.csdn.net/tangkund3218/article/details/46945311

dev_chao
粉丝 5
博文 36
码字总数 11158
作品 0
广州
私信 提问
为什么MongoDB采用B树索引,而Mysql用B+树做索引

先从数据结构的角度来答。 题主应该知道B-树和B+树最重要的一个区别就是B+树只有叶节点存放数据,其余节点用来索引,而B-树是每个索引节点都会有Data域。 这就决定了B+树更适合用来存储外部数...

china_lx1
2018/06/27
0
0
MySql数据库 学习记录

什么事MySQL数据库? 通常意义上,数据库也就是数据的集合,具体到计算机上数据库可以是存储器上一些文件的集合或者一些内存数据的集合。我们常说的MySQL数据库,sql server数据库等其实是数...

杨春炼
2016/12/24
37
0
认识MySQL---JC MySQL系列(一)

(一)认识MySQL MySQL数据库是开放源代码的关系型数据库。目前,它可以提供的功能有:支持sql语言、子查询、存储过程、触发器、视图、索引、事务、锁、外键约束和影像复制等。 同Oracle和S...

jk88
2013/05/24
0
0
**关于mysql5.7版本新特性介绍 ------数据类型 JSON**

关于mysql5.7版本新特性介绍 ------数据类型 JSON 测试环境: 内容简介: 随着mysql5.7版本的到来,大家对其的热情也越来越高涨,身为mysql圈子里的一员,我本身也对mysql5.7的一些新特性有所...

红隐
2017/12/22
0
0
MySQL专题1之MySQL概述

1、数据库简介 - 当你想要收听最喜欢的歌曲时,可以从智能手机中打开播放列表。在这种情况下,播放列表是从数据库中读取出来的。 - 当你拍摄照片并将其上传到微博,朋友圈等,这样的社交网络...

极客微信条
2017/11/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

新建作业20191011121223

2.编写一个程序,发出一声警报,然后打印下面的文本: Startled by the sudden sound,Sally shouted,"By the Great Pumpkin,what was that!" #include<stdio.h>int main(){printf("\a");......

电子197朱妍
18分钟前
2
0
家庭作业——苗钰婷

2 编写一个程序,发出一声警报,然后打印下面的文本: Startled by the sudden sound, Sally shouted, "By the Great Pumpkin, what was that! #include<stdio.h>int main(){......

OSC_Okruuv
39分钟前
6
0
经典系统设计面试题解析:如何设计TinyURL(一)

原文链接: https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
40分钟前
5
0
2.面向对象设计原则(7条)

开闭原则 开闭原则的含义是:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求。 实现方法 可以通过“抽象约束、封装变化”来实...

Eappo_Geng
42分钟前
8
0
8086汇编基础 debug P命令 一步完成loop循环

    IDE : Masm for Windows 集成实验环境 2015     OS : Windows 10 x64 typesetting : Markdown    blog : my.oschina.net/zhichengjiu    gitee : gitee.com/zhichengjiu   ......

志成就
46分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部