聚集索引

B-Tree 和 B+Tree 结构及应用,InnoDB 引擎, MyISAM 引擎

吃可爱长大的小学妹 提交于 2020-01-23 23:45:30
1.什么是B-Tree 和 B+Tree,他们是做什么用的? B-Tree是为了磁盘或其它存储设备而设计的一种 多叉平衡查找树 ,B-Tree 和 B+Tree 广泛应用于文件存储系统以及数据库系统中。 在大规模数据存储中,实现索引查询这样一个实际背景下,树节点存储的元素数量是有限的(如果元素数量非常多的话,树的高度就会增大,查找就退化成节点内部的线性查找了),这样导致二叉查找树结构由于 树的深度过大而造成磁盘I/O读写过于频繁,进而导致查询效率低下 (为什么会出现这种情况?这跟外部存储器-磁盘的存储方式有关)。那么该如何减少树的高度呢?一个基本的想法就是:采用 多叉树 结构(每个节点存放多个元素,每个节点有多个子节点,这样树的高度就降低了)。根据平衡二叉树的启发,自然就想到平衡多路查找树结构。B-Tree的各种操作能使B-Tree保持较低的高度,从而达到有效避免磁盘过于频繁的查找存取操作,从而有效提高查找效率。 2.B-Tree 2.1定义 m阶B-Tree满足以下条件: 1、每个节点最多拥有m个子树 2、根节点至少有2个子树 3、分支节点至少拥有m/2颗子树(除根节点和叶子节点外都是分支节点) 4、所有叶子节点都在同一层 5、每个节点最多可以有m-1个key 6、每个节点中的key以升序排列 7、节点中key元素左节点的所有值都小于或等于该元素

第五章-索引与算法

别等时光非礼了梦想. 提交于 2020-01-18 02:17:31
5.1 InnoDB存储引擎索引概述 183 InnoDB存储引擎支持以下几种常见的索引: B+树索引 全文索引 哈希索引 InnoDB 存储引擎支持的哈希索引是自适应的,InnoDB 存储引擎会根据表的使用情况自动为表生成哈希索引,不能人为干预是否在一张表中生成哈希索引。 B+树索引目前关系型数据库系统中查找最为常用和最为有效的索引。 B+树索引并不能找到一个给定键值的具体行,只能找到对应的页,然后把页读到内存,再在内存中进行查找。 5.2 数据结构与算法 184 5.2.1 二分查找法 184 5.2.2 二叉查找树和平衡二叉树 185 5.3 B+树 187 5.3.1 B+树的插入操作 187 5.3.2 B+树的删除操作 190 5.4 B+树索引 191 根据叶子节点存放的是否是一整行的信息,可将数据库中的B+树索引分为聚集索引(clustered inex)和辅助索引(非聚集索引)(secondary index) 5.4.1 聚集索引 192 聚集索引(clustered index)就是按照每张表的主键构造一棵 B+树,同时叶子节点中存放的即为表的行记录数据(所有叶子节点加起来就是整张表的行记录数据),也将聚集索引的叶子节点称为数据页。 聚集索引的存储并不是物理上连续的,而是逻辑上连续的。 5.4.2 辅助索引 196 对于辅助索引(Secondary Index

Mongodb 安装部署

时光毁灭记忆、已成空白 提交于 2020-01-15 12:10:30
一、简介 MongoDB 是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。 二、什么是mongodb 1.mongodb是有C++语言编写,是一个机遇分布式文件存储的开源数据库系统。 2.在高负载的情况下,随时添加更多的节点,可以保证服务器性能。 3.mongodb旨在为WEB应用提供可扩展的高性能数据存储解决方案。 4.mongodb将数据存储为一个文档,数据结构由键值(key=>value)对组成。 5.mongodb文档类似于json对象,字段值可以包含其他文档,数组及文档数组。 三、mongodb的优缺点 优点: 文档结构的存储方式,能够更便捷的获取数据 内置GridFS,支持大容量存储 海量数据下,性能优越 动态查询 全索引支持,扩展到内部对象和内嵌数组 查询记录分析 快速,就地更新 高效存储二进制大对象(照片,视频等等) 复制(副本集)和支持自动故障恢复

MySQL InnoDB存储引擎

走远了吗. 提交于 2020-01-11 12:29:07
/*--> */ /*--> */ 介绍 本篇文章是对Innodb存储引擎的概念进行一个整体的概括,innodb存储引擎的概念是mysql数据库中最关键的几个概念之一,涉及的内容非常的广;由于个人的理解能力有限如果有不对的地方还见谅。 MySQL对应InnoDB版本 MySQL 5.1》InnoDB 1.0.X MySQL 5.5》InnoDB 1.1.X MySQL 5.6》InnoDB 1.2.X 后台线程 1.Master Thread 负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性;包括刷新脏页、合并插入缓冲、undo页的回收。 2.IO Thread innodb存储引擎中大量使用了AIO(Async IO)来处理写IO请求来提高数据库的并发性能,共有四类IO线程,分别是:insert buffer thread、log thread、read thread、write thread。其中read thread和write thread分别有四个线程,可以通过innodb_read_io_threads和innodb_write_io_threads来配置。 SHOW VARIABLES LIKE 'innodb_%io_threads' 或者 SHOW ENGINE INNODB STATUS \G; 3.Purge Thread线程 purge

『浅入浅出』MySQL 和 InnoDB

﹥>﹥吖頭↗ 提交于 2020-01-09 11:41:03
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL、PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系的认知,所以最近两个月的时间看了几本数据库相关的书籍并且阅读了 MySQL 的官方文档,希望对各位了解数据库的、不了解数据库的有所帮助。 本文中对于数据库的介绍以及研究都是在 MySQL 上进行的,如果涉及到了其他数据库的内容或者实现会在文中单独指出。 数据库的定义 很多开发者在最开始时其实都对数据库有一个比较模糊的认识,觉得数据库就是一堆数据的集合,但是实际却比这复杂的多,数据库领域中有两个词非常容易混淆,也就是 数据库 和 实例 : 数据库:物理操作文件系统或其他形式文件类型的集合; 实例:MySQL 数据库由后台线程以及一个共享内存区组成; 对于数据库和实例的定义都来自于 MySQL 技术内幕:InnoDB 存储引擎 一书,想要了解 InnoDB 存储引擎的读者可以阅读这本书籍。 数据库和实例 在 MySQL 中,实例和数据库往往都是一一对应的,而我们也无法直接操作数据库,而是要通过数据库实例来操作数据库文件,可以理解为数据库实例是数据库为上层提供的一个专门用于操作的接口。 在 Unix 上,启动一个

数据库索引,这一篇就够了

寵の児 提交于 2020-01-04 01:09:10
目录 1.什么是索引?为什么要用索引? 1.1索引的含义 1.2为什么用? 2.索引的作用与缺点 2.1作用 2.2缺点 3.索引的使用场景 3.1应创建索引的场景 3.2不应创建索引的场景 4.索引的分类与说明 4.1主键索引 4.2单列索引 4.3唯一索引 4.4复合索引 4.5聚集索引与非聚集索引 4.5.1聚集索引 4.5.2非聚集索引 4.5.3使用及语法 4.5.4使用场景对比 4.6聚簇索引与非聚簇索引 4.6.1聚簇索引 4.6.2非聚簇索引 4.6.3Mysql的MYISAM和INNODB引擎 4.6.4对比总结 4.7稠密索引与稀疏索引 4.7.1稠密索引 4.7.2稀疏索引 5.索引的底层原理 5.1 B-Tree 5.2 B+Tree 5.3 B-树和B+树的区别 6. 总结 1.什么是索引?为什么要用索引? 1.1索引的含义 数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询,更新数据库中表的数据.索引的实现通常使用B树和变种的B+树(mysql常用的索引就是B+树)。除了数据之外,数据库系统还维护为满足特定查找算法的数据结构,这些数据结构以某种方式引用数据.这种数据结构就是索引! 简言之,索引就类似于书本,字典的目录! 1.2为什么用? 打个比方,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话

SQL Server查询优化与事务处理

早过忘川 提交于 2020-01-03 08:05:28
博文目录 一、索引 二、视图 三、存储过程 四、系统存储过程 五、触发器 六、事务 七、锁 一、索引 索引提供指针以指向存储在表中指定列的数据值,然后根据指定的次序排列这些指针,再跟随指针到达包含该值的列。 1、什么是索引 数据库中的索引与书籍中的目录相似。在一本书中,无需阅读整本书,利用目录就可以快速的查找到所需的信息。在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需的数据。书中的目录就是一个词语列表,其中注明了包含各个词的页码。而数据库中的索引是某个表中一列或若干列值的集合,以及物理表示这些值得数据业的逻辑指针清单。 索引是SQL Server编排数据的内部方法,它为SQL Server提供一种方法来编排查询数据的路由。 索引页是数据库中存储索引的数据页。索引页存放检索数据行的关键字页以及该数据行的地址指针。通过使用索引,可以大大提高数据库的检索速度,改善数据库性能。 2、索引分类 1)唯一索引 唯一索引不允许两行具有相同的索引值。 如果现有数据中存在重复的键值,则一般情况下大多数数据库不允许创建唯一索引。当新数据使表中的键值重复时,数据库也拒绝接收此数据。创建了唯一约束,将自动创建唯一索引。尽管唯一索引有助于找到信息,但是为了获得最佳性能,建议使用主键约束。 2)主键索引 在数据库关系图中为表定义一个主键将自动创建主键索引,主键索引是唯一索引的特殊类型。

翻译: Clustered Index Design Considerations 聚集索引设计注意事项

你。 提交于 2020-01-01 04:56:03
原文出自: 《Pro SQL Server Internals, 2nd edition》 的CHAPTER 7 Designing and Tuning the Indexes中的Clustered Index Design Considerations一节(即P155~P165) ,Dmitri Korotkevitch,侵删 每次更改聚集索引键的值时,都会发生两件事。 首先,SQL Server将行移动到聚集索引页链和数据文件中的不同位置。 其次,它更新了row-id,它是聚集索引键。 存储的行id,需要在所有非聚集索引中更新。 就I / O而言,这可能是昂贵的,特别是在批量更新的情况下。 此外,它可以增加聚集索引的碎片,并且在行ID大小增加的情况下,可以增加非聚集索引的碎片。 因此,最好有一个静态聚集索引,其中键值不会改变。 所有非聚集索引都使用聚集索引键作为row-id。 过宽的聚集索引键会增加非聚集索引行的大小,并且需要更多空间来存储它们。 因此,SQL Server需要在索引或范围扫描操作期间处理更多数据页,这会降低索引的效率。 在非唯一非聚集索引的情况下,row-id也存储在非叶索引级别,这反过来会减少每页索引记录的数量,并可能导致索引中的额外中间级别。 尽管非叶索引级别通常缓存在内存中,但每次SQL Server遍历非聚集索引B-Tree时

翻译:设计和优化索引

筅森魡賤 提交于 2020-01-01 04:55:20
定义一个索引方法在每一处都能有效这是不可能的,每一个系统都是独一的,需要基于工作负载的索引方法,商业要求和很多其他的因素,然而,有很多的设计考虑和指导都能够呗应用到每一个系统,当我们在优化系统时也是同样的,虽然优化是一个迭代过程,在每一个的系统中都是独特的,在每一个数据系统中有一组技术能够用于侦探出无效性。在这一章节中,我们将会介绍很多当你在设计新的索引和优化现有的数据库,你必须要记住的重要因素; 集群索引设计注意事项 每次更改聚集索引键的值时,都会发生两件事情。首先,SQL Server将行移动到集群索引页链和数据文件中的不同位置。其次,它更新行id,这是聚集索引键。行id存储在所有非集群索引中,需要更新。就I/O而言,这可能很昂贵,尤其是在批量更新的情况下。此外,它还可以增加聚集索引的碎片,并且在行id大小增加的情况下,还可以增加非聚集索引的碎片。因此,最好在键值不变的情况下使用静态聚集索引。 所有非聚集索引都使用聚集索引键作为行id。太宽的聚集索引键会增加非聚集索引行的大小,并需要更多的空间来存储它们。因此,SQL Server在索引或范围扫描操作期间需要处理更多的数据页,这会降低索引的效率。 对于非惟一的非集群索引,行id也存储在非叶索引级别,这反过来减少了每页索引记录的数量,并可能导致索引中额外的中间级别。尽管非叶索引级别通常缓存在内存中,但每次SQL

翻译:设计和优化索引

不问归期 提交于 2020-01-01 04:55:07
定义一个索引方法在每一处都能有效这是不可能的,每一个系统都是独一的,需要基于工作负载的索引方法,商业要求和很多其他的因素,然而,有很多的设计考虑和指导都能够呗应用到每一个系统,当我们在优化系统时也是同样的,虽然优化是一个迭代过程,在每一个的系统中都是独特的,在每一个数据系统中有一组技术能够用于侦探出无效性。在这一章节中,我们将会介绍很多当你在设计新的索引和优化现有的数据库,你必须要记住的重要因素; 集群索引设计注意事项 每次更改聚集索引键的值时,都会发生两件事情。首先,SQL Server将行移动到集群索引页链和数据文件中的不同位置。其次,它更新行id,这是聚集索引键。行id存储在所有非集群索引中,需要更新。就I/O而言,这可能很昂贵,尤其是在批量更新的情况下。此外,它还可以增加聚集索引的碎片,并且在行id大小增加的情况下,还可以增加非聚集索引的碎片。因此,最好在键值不变的情况下使用静态聚集索引。 所有非聚集索引都使用聚集索引键作为行id。太宽的聚集索引键会增加非聚集索引行的大小,并需要更多的空间来存储它们。因此,SQL Server在索引或范围扫描操作期间需要处理更多的数据页,这会降低索引的效率。 对于非惟一的非集群索引,行id也存储在非叶索引级别,这反过来减少了每页索引记录的数量,并可能导致索引中额外的中间级别。尽管非叶索引级别通常缓存在内存中,但每次SQL