赞
踩
索引是为了能够让我们更快得到我们想要的数据。
类比于字典,索引就是我们的边旁指引一样;
就像是,一本书一样,能够根据他的目录而找到他相关内容,只是索引关联的更加紧密,搜寻密度更大。
索引-数据
一般人才的思路:
1,关键值:key
2,文件名称:
3,偏移量:offset
但是一个缺点就是很慢,根本达不到我们能够快速找到目的
首先我们要知道我们需要设计一个什么样的数据库:
也就是所谓了OLTP和OLAP之间我们选谁?
好了一个小问题?
OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。
OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。
但是毫无疑问,上面的那种基本的索引结构,是不能完成对于的上面两种的应用用。
所以,为了更快,我们需要使用什么?
数据结构!
看下面↓
B+树
好了,问题来了!
有那么多数据结构,哈希,图,链表,二叉树,红黑树,B树,B-树,但是为什么使用B+树?
注意:B-树(B杆树),请不要念错,面试会被嘲讽的!!!
注意1,Mysql文档中写明底层是用B树实现的,但是实际上是B+树实现的
1,B树及其延伸B+树和B-树
2,哈希表
** 不同 数据文件**在我们物理机磁盘上面的,不同组织形势。
一个小问题?一共有多少种存储引擎:
打开cmd 进入数据库输入以下命令:
show engines;
如果笔试要求你回答,
InnoDB,Memory,MyISAM;
扩展:
InnoDB和MyISAM,使用B+树,进行索引,但是实现不一样
第一个重大区别:
是InnoDB的数据文件本身就是索引文件。
MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。
而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。 这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
参考大佬文章:
Myisam和Innodb索引实现的不同(存储结构)
InnoDB支持自适应哈希,
Innodb存储引擎会监控对表上二级索引的查找,如果发现某二级索引被频繁访问,二级索引成为热数据,建立哈希索引可以带来速度的提升
参考大佬文章:
InnoDB关键特性之自适应索引
Memory,使用哈希,进行索引
总所周知,磁盘读取速度太慢了,内存倒是很快,
但是内存有两个缺点,
第一,成本高,
第二,断电无法保存数据。
程序的局部性原理是指程序在执行时呈现出局部性规律,即在一段时间内,整个程序的执行仅限于程序中的某一部分。
相应地,执行所访问的存储空间也局限于某个内存区域。
局部性原理又表现为:时间局部性和空间局部性。时间局部性是指如果程序中的某条指令一旦执行,则不久之后该指令可能再次被执行;
如果某数据被访问,则不久之后该数据可能再次被访问。
空间局部性是指一旦程序访问了某个存储单元,则不久之后,其附近的存储单元也将被访问。
所以操作系统中有这样的一个概念,磁盘预读。
—页是存储器的逻辑块,操作系统往往将磁盘和主存切割为连续的大小相等块,每个存储块称为一页(许多操作系统中,页的大小通常是4k),主存和磁盘以也交换数据。
(1)索引是帮助MySQL高效获取数据的数据结构
(2)索引存储在文件系统中
(3)索引的文件存储形势的与存储引擎有关
------索引文件的结构:
---------hash
---------二叉树
---------B树
---------B+树
优点:哈希根据Key值查询数值,所以在进行等值查询很快的,但是哈希使用需要要让数值分布均匀(使用扰乱函数)解决冲突问题。
缺点:
1,在现实使用,我们系统使用的往往是一个范围查询,这个时候哈希需要多行比对,效率就慢下来了。
2,哈希hash存储需要的将数据文件全部添加到内存中,比较耗费内存空间。
(1)因为Memory表的所有数据都是存储在内存上的,如果内存出现异常会影响到数据的完整性。
(2)如果重启机器或者关机,表中的所有数据都将消失,因此,基于Memory存储引擎的表的生命周期都比较短,一般都是一次性的。
(3)因此,其基于内存中的特性,这类表的处理速度会非常快,但是,其数据易丢失,生命周期短。基于其这个缺陷,选择Memory存储引擎时需要特别小心。
Memory使用场景:
1,用于查找或者是映射表,例如邮编和地区的对应表
2,用于保存数据分析中产生的中间表
3,用于缓存周期性聚合数据的结果表
MySQL存储引擎之Memory
无论是二叉树或者红黑树,都有可能因为数据量过多而导致IO次数变多,影响数据读取效率。
不清楚,可以去了解看大佬文章:整理得吐血了,二叉树、红黑树、B&B+树超齐全,快速搞定数据结构
所以我们可以看到的,在设计数据库索引的时候,要满足一下两个条件:
1,注意树的深度
2,Io的次数
所以知道为啥公司不让各位使用通配符了 “ * ” 了吧,因为在服务层与数据库磁盘间有个交互的过程,如果使用通配符,那么就会导致Io次数量太大了。
所以我们用B树:
实例说明:每个节点占用一个磁盘块,一个节点上有两个升序排序的关键字和三个指向子树根节点所在的磁盘地址,两个关键字划分成的三个范围域对应是哪个指针指向的字数和数值的范围域。以根节点为例,关键字16和34,P1指针指向的子树的数值范围小于16,P2指针指向的子树的数值范围为16-24,
P3指针指向的子树的数值范围大于34.
查找关键字过程:
1,根据根节点找到磁盘块1,读入内存。【磁盘I/O 操作数 1 次】
2, 比较关键字26在区间(16,34),查找磁盘块1的指针P2
3,根据P2指针找到磁盘块 3,读入内存。【磁盘I/O 操作数2次】
为了扩展数据量和查询速度:
我们去掉父节点的data来存储更多的指针和key,范围。
于是有了B+树
注意:
B+树中有两个头指针,一个指向根节点,一个指向最小叶节点,而且所有叶子结点是链式环结构
因此B+Tree可以进行两种查询运算:一种是对于主键的范围查询和分页查找,另一种是根节点开始,进行随机查找。
注意:
1,InnoDB是通过B+Tree结构对主键创建索引,然后叶子节点中存储纪录,如果没有主键,那么会选择唯一键,如果没有为唯一键,那么会生成一个6节点的row_id 来作为主键
2,如果创建索引的键是其他字段,那么子节点中存储的是该记录的主键,然后在通过缩影找到了对应的记录,叫做圆表。
3,在使用主键的时候,单机数据库使用主键自增(推荐),但是不要在分布式中使用主键自增
聚簇索引:InnoDB,将索引和数据放在一起。
非聚簇索引:MyISAM,索引与数据分离开来。
可以参考文章:
快速理解什么是聚簇索引和非聚簇索引?
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。