聚簇索引

Mysql中的索引

末鹿安然 提交于 2019-12-01 17:13:19
1,什么是索引,为什么要使用索引? 索引是帮助Mysql高效获取数据的排好序的数据结构。建立索引可以帮助我们快速检索我们需要的信息,减少磁盘的I/O次数,加快检索速度。索引的数据结构包括:二叉树,红黑树,Hash表,B-树等。 2,数据查询的方式 二叉查找树的方式查找信息 普通情况下,在一个二叉树中查找到5非常快速。只需要2步,但在某些极端情况下,如对于顺序插入信息的二叉树,查找到我们需要的信息就非常麻烦了。 红黑树 红黑树是一种 自平衡二叉查找树 ,就是会自动平衡更新根节点和其它节点的位置,也就是说根节点和其它节点的位置是不固定,会根据插入的信息进行动态改变的。 按照1~5的顺序插入数据后,会重新排列分支节点的位置。 对于少量数据使用红黑树是完全可以的,但是一个项目的数据库中存储的数据都是10万条以上,再使用红黑树,树的度又会变得很大了。这个时候就可以使用B 树了。 B 树 B树是一种 多路自平衡搜索树 ,它是一种特殊的平衡二叉树,但是B书允许每个节点有更多的子节点。B树示意图如下: B树的特点: (1)所有键值分布在整个树中(2)任何关键字出现且只出现在一个节点中 (3)搜索有可能在非叶子节点结束(4)在关键字全集内做一次查找,性能逼近二分查找算法 比如我们想要找到主键为28的数据,过程如下: 1,根据根节点找到磁盘块1,进行一次I/O(磁盘的输入和输出)操作; 2

MYSQL索引的作用和创建

梦想与她 提交于 2019-12-01 04:32:14
索引是查询优化最主要的方式; 查询方式: 一种是:全表扫描; 一种是:利用数据表上建立的所以进行扫描。 如:对表中name字段建立索引;则按照表中name字段进行索引排序,并为其建立指向数据表中记录所在位置的“指针”。 Mysql索引根据用途分为: 1.普通索引 :列值 可以取空值或重复值 。创建使用关键字INDEX或KEY; 2.唯一索引 :列值不能重复;即索引列值必须是唯一的,但 可以是空值 ;创建使用关键字UNIQUE; 3.主键索引 :主键索引是系统自动创建的主键索引, 并且是唯一的 。与唯一索引区别是; 列值不能为空 ; 4.聚簇索引 :就是数据存储的物理存储顺序,非聚簇索引就是索引顺序与数据的物理顺序无关。一个表只能有一个聚簇索引。目前只有InoDB和solidDB支持。 5.全文索引 :只能创建在varchar或text的列上;建立全文索引能够在全文索引的列上进行查找。 (1) 单列索引 :就是一个索引只包含表中的一个列;比创建一个学号ID的索引;以name再创建一个姓名的单列索引。即每个索引包含一个列。 (2) 组合索引(复合索引或多列索引) :就是表中的两个列或多个列来创建成一个索引;比如;以用户ID、用户名Name、用户年龄Age来创建的索引就是联合索引。 排序规则是;左前缀原则:即先按照用户ID,排序后;当第一列值相同的情况下;则按照用户名Name第二列判刑

mysql聚簇索引,非聚簇索引

感情迁移 提交于 2019-11-30 23:27:42
聚簇索引错放了整行数据的值,聚簇索引使用了B+TREE,这是一种多路平衡查询书,节点天然有序(方便范围查询和排序,而哈希索引不具备,同时哈希索引适合等值查询,不支持最左前缀匹配规则,且在有大量重复键的情况下,哈希碰撞导致效率低下),末端叶子节点包含了所有的节点,多路使得B+TREE的io查询次数下降, 非聚簇索引只储存了主键的值,通过非聚簇索引查到查询到索引值对应的主键后,再用逐渐去查询聚簇索引中的数据,但只查询某个值时,若当前非聚簇索引 来源: https://www.cnblogs.com/kkkboshow/p/11644561.html

[MySQL] 5.索引(三)——聚簇索引

与世无争的帅哥 提交于 2019-11-30 22:35:21
聚簇索引 聚簇索引是一种数据存储方式,InnoDB的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行。当表有聚簇索引时,它的数据行实际上存放在索引的叶子页中(叶子页包含了行的全部数据,节点页只包含了索引列)。“聚簇”表示数据行和相邻的键值紧凑的存储在一起。一个表只能有一个聚簇索引。 InnoDB会选择主键列进行聚簇索引,如果没有定义主键,InnoDB会选择唯一的非空索引代替。如果还是没有,InnoDB会隐式定义一个主键来作为聚簇索引。InnoDB只聚集在同一个页面中的记录。 InnoDb的普通索引(二级索引)的叶子结点中存放的是主键的值,所以需要先查询普通索引(二级索引)的叶子节点找到对应的主键值,然后再根据主键值去聚集索引中查询到对应的数据。 非聚集索引的索引与数据是存在不同文件的。 聚簇索引优点: 可以把相关的数据保存在一起,例如实现电子邮箱时,可以根据用户ID来聚集数据,这样只需要从磁盘读取少数数据页就能获取某个用户的全部邮件,减少磁盘I/O次数。 数据访问更快:聚簇索引同时将索引和数据保存在同一个B-Tree中,因此从聚簇索引中获取数据要比非聚簇索引更快。 使用覆盖索引扫描的查询可以直接使用节点中的主键值。 聚簇索引缺点: 聚簇索引最大限度地提高了I/O密集型应用的性能。如果数据全放放在内存中,那么聚簇索引就没了优势。 插入速度严重依赖于插入顺序

[MySQL] 5.索引(三)——聚簇索引

旧巷老猫 提交于 2019-11-30 22:07:15
聚簇索引 聚簇索引是一种数据存储方式,InnoDB的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行。当表有聚簇索引时,它的数据行实际上存放在索引的叶子页中(叶子页包含了行的全部数据,节点页只包含了索引列)。“聚簇”表示数据行和相邻的键值紧凑的存储在一起。一个表只能有一个聚簇索引。 InnoDB会选择主键列进行聚簇索引,如果没有定义主键,InnoDB会选择唯一的非空索引代替。如果还是没有,InnoDB会隐式定义一个主键来作为聚簇索引。InnoDB只聚集在同一个页面中的记录。 InnoDb的普通索引(二级索引)的叶子结点中存放的是主键的值,所以需要先查询普通索引(二级索引)的叶子节点找到对应的主键值,然后再根据主键值去聚集索引中查询到对应的数据。 非聚集索引的索引与数据是存在不同文件的。 聚簇索引优点: 可以把相关的数据保存在一起,例如实现电子邮箱时,可以根据用户ID来聚集数据,这样只需要从磁盘读取少数数据页就能获取某个用户的全部邮件,减少磁盘I/O次数。 数据访问更快:聚簇索引同时将索引和数据保存在同一个B-Tree中,因此从聚簇索引中获取数据要比非聚簇索引更快。 使用覆盖索引扫描的查询可以直接使用节点中的主键值。 聚簇索引缺点: 聚簇索引最大限度地提高了I/O密集型应用的性能。如果数据全放放在内存中,那么聚簇索引就没了优势。 插入速度严重依赖于插入顺序

[MySQL] 5.索引(三)——聚簇索引

天涯浪子 提交于 2019-11-30 21:41:30
聚簇索引 聚簇索引是一种数据存储方式,InnoDB的聚簇索引实际上在同一个结构中保存了B-Tree索引和数据行。当表有聚簇索引时,它的数据行实际上存放在索引的叶子页中(叶子页包含了行的全部数据,节点页只包含了索引列)。“聚簇”表示数据行和相邻的键值紧凑的存储在一起。一个表只能有一个聚簇索引。 InnoDB会选择主键列进行聚簇索引,如果没有定义主键,InnoDB会选择唯一的非空索引代替。如果还是没有,InnoDB会隐式定义一个主键来作为聚簇索引。InnoDB只聚集在同一个页面中的记录。 InnoDb的普通索引(二级索引)的叶子结点中存放的是主键的值,所以需要先查询普通索引(二级索引)的叶子节点找到对应的主键值,然后再根据主键值去聚集索引中查询到对应的数据。 非聚集索引的索引与数据是存在不同文件的。 聚簇索引优点: 可以把相关的数据保存在一起,例如实现电子邮箱时,可以根据用户ID来聚集数据,这样只需要从磁盘读取少数数据页就能获取某个用户的全部邮件,减少磁盘I/O次数。 数据访问更快:聚簇索引同时将索引和数据保存在同一个B-Tree中,因此从聚簇索引中获取数据要比非聚簇索引更快。 使用覆盖索引扫描的查询可以直接使用节点中的主键值。 聚簇索引缺点: 聚簇索引最大限度地提高了I/O密集型应用的性能。如果数据全放放在内存中,那么聚簇索引就没了优势。 插入速度严重依赖于插入顺序

mysql 锁机制 详解 一

a 夏天 提交于 2019-11-30 16:44:02
1 背景 1 1.1 MVCC:Snapshot Read vs Current Read 2 1.2 Cluster Index:聚簇索引 3 1.3 2PL:Two-Phase Locking 3 1.4 Isolation Level 4 2 一条简单SQL的加锁实现分析 5 2.1 组合一:id主键+RC 6 2.2 组合二:id唯一索引+RC 6 2.3 组合三:id非唯一索引+RC 7 2.4 组合四:id无索引+RC 8 2.5 组合五:id主键+RR 9 2.6 组合六:id唯一索引+RR 9 2.7 组合七:id非唯一索引+RR 9 2.8 组合八:id无索引+RR 11 2.9 组合九:Serializable 12 3 一条复杂的SQL 12 4 死锁原理与分析 14 5 总结 16 背景 MySQL/InnoDB的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事咨询这方面的问题。同时,微博上也经常会收到MySQL锁相关的私信,让我帮助解决一些死锁的问题。本文,准备就MySQL/InnoDB的加锁问题,展开较为深入的分析与讨论,主要是介绍一种思路,运用此思路,拿到任何一条SQL语句,都能完整的分析出这条语句会加什么锁?会有什么样的使用风险?甚至是分析线上的一个死锁场景,了解死锁产生的原因。 注: MySQL是一个支持插件式存储引擎的数据库系统

索引工作原理

ⅰ亾dé卋堺 提交于 2019-11-30 12:49:49
聚簇索引 每个InnoDB的表都拥有一个索引,称之为聚簇索引,此索引中存储着行记录,一般来说,聚簇索引是根据主键生成的。为了能够获得高性能的查询、插入和其他数据库操作,理解InnoDB聚簇索引是很有必要的。 聚簇索引按照如下规则创建: 当定义了主键后,InnoDB会利用主键来生成其聚簇索引; 如果没有主键,InnoDB会选择一个非空的唯一索引来创建聚簇索引; 如果这也没有,InnoDB会隐式的创建一个自增的列来作为聚簇索引。 聚簇索引整体是一个b+树,非叶子节点存放的是键值,叶子节点存放的是行数据,称之为数据页,这就决定了表中的数据也是聚簇索引中的一部分,数据页之间是通过一个双向链表来链接的,B+树是一棵平衡查找树,也就是聚簇索引的数据存储是有序的,但是这个是逻辑上的有序,事实上物理存储可以隔很远,因为数据页之间是通过双向链表来连接,假如物理存储是顺序的话,那维护聚簇索引的成本非常的高。 辅助索引 除了聚簇索引之外的索引都可以称之为辅助索引,与聚簇索引的区别在于辅助索引的叶子节点中存放的是主键的键值。一张表可以存在多个辅助索引,但是只能有一个聚簇索引。 通过辅助索引来查找对应的行记录的话,需要进行两步,第一步通过辅助索引来确定对应的主键,第二步通过相应的主键值在聚簇索引中查询到对应的行记录,也就是进行两次B+树搜索。相反通过辅助索引来查询主键的话,遍历一次辅助索引就可以确定主键了

数据库索引的所用,有点和缺点

时间秒杀一切 提交于 2019-11-30 11:01:13
为什么要创建索引呢?这是因为,创建索引可以大大提高系统的性能。 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 第二,可以大大加快 数据的检索速度,这也是创建索引的最主要的原因。 第三,可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。 第四,在使用分组和排序 子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。 第五,通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。 也许会有人要问:增加索引有如此多的优点,为什么不对表中的每一个列创建一个索引呢?这种想法固然有其合理性,然而也有其片面性。虽然,索引有许多优点, 但是,为表中的每一个列都增加索引,是非常不明智的。这是因为,增加索引也有许多不利的一个方面。 第一,创建索引和维护索引要耗费时间,这种时间随着数据 量的增加而增加。 第二,索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大。 第三,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。 索引是建立在数据库表中的某些列的上面。因此,在创建索引的时候,应该仔细考虑在哪些列上可以创建索引,在哪些列上不能创建索引。一般来说,应该在这些列 上创建索引,例如: 在经常需要搜索的列上,可以加快搜索的速度;

B+Tree索引原理

拜拜、爱过 提交于 2019-11-30 06:36:26
什么是索引? 索引是一种数据结构,具体表现在查找算法上。 索引目的 提高查询效率 【类比字典和借书】 如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql。如果没有索引,那么你可能需要把所有单词看一遍才能找到你想要的。 去图书馆借书也是一样,如果你要借某一本书,一定是先找到对应的分类科目,再找到对应的编号,这是生活中活生生的例子,通用索引,可以加快查询速度,快速定位。 数据结构——树 树 二叉树 每个节点最多含有两个子树的树称为二叉树。 二叉查找树ADT Tree 左子树的键值小于根的键值,右子树的键值大于根的键值。 平衡二叉树AVL Tree 在符合二叉查找树的条件下,还满足任何节点的两个子树的高度最大差为1。 BTree BTree也称为平衡多路查找树 B-Tree是为磁盘等外存储设备设计的一种平衡查找树。 B+Tree B+Tree是在B-Tree基础上的一种优化 非叶子结点只存储键值信息,不存储数据 所有的叶子结点都有一个链指针 数据记录都存放在叶子结点中 MySQL默认使用B+Tree索引 索引本身也很大,所以存储在磁盘中,需要加载到内存中执行。 故: 索引结构优劣标准:磁盘I/O次数 BTree是为了充分利用磁盘预读功能而创建出来的一种数据结构。 局部性原理和磁盘预读 局部性原理:当一个数据被用到