聚簇索引

神奇的 SQL 之 WHERE 条件的提取与应用

你。 提交于 2020-03-02 12:18:48
问题描述 一条 SQL 在数据库中是如何执行的呢 ?相信很多人都会对这个问题比较感兴趣。但是,感兴趣归感兴趣,你得去追呀,还臆想着她主动到你怀里来 ? 一条 SQL 在数据库中的生命周期涵盖了 SQL 的词法解析、语法解析、权限检查、查询优化、SQL执行等一系列的步骤,是一个相当复杂的过程,不亚于你追她的艰苦历程,不是只言片语就说的完的。但是,大家先别紧张,上面说的那些了,今天一个也不讲,气不气 ? 今天和大家一起来看一下 SQL 生命周期中比较有意思的一个环节 给定一条 SQL,如何提取其中的 where 条件 ? where 条件中的每个子条件,在 SQL 执行的过程中有分别起着什么样的作用 ? SQL 执行流程 这是 MySQL 数据库中 SQL 的执行流程,其他数据库应该类似 关系型数据库中的数据组织 关系型数据库中,数据组织涉及到两个最基本的结构:表与索引。表中存储的是完整数据记录,分为堆表和聚簇索引表;堆表中所有的记录无序存储,聚簇索引表中所有的记录则是按照记录主键进行排序存储。索引中存储的是完整记录的一个子集,用于加速记录的查询速度,索引的组织形式,一般均为B+树结构 MySQL 的 InnoDB 采用的是聚簇索引表,数据记录和索引是一起存储的,类似如下 InnoDB 二级索引(非聚簇索引)的结构与聚集索引的结构基本相同,只是叶子节点有些许差别

MySQL InnoDB索引的存储结构

大城市里の小女人 提交于 2020-03-01 22:51:25
InnoDB索引的数据结构 InnoDB索引采用了B-Tree的数据结构,数据存储在叶子节点上,每个叶子节点默认的大小是16KB。 当新记录插入到InnoDB聚簇索引中时,如果按顺序插入索引记录(升序或降序),当达到叶子节点最大的容量时,下一条记录就会写到新的的页中。叶子节点可使用的容量为总容量的15/16,InnoDB会留1/16的空间,以备将来插入和更新索引记录时使用, 如果以随机顺序插入记录,则页面的容量为1/2到15/16之间。 你可以设置 innodb_page_size 来调整页的大小,支持 64KB, 32KB, 16KB (默认), 8KB, 和4KB。 索引的分类 InnoDB的索引类型分为 主键索引和非主键索引 。 主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引(clustered index)。整张表的数据其实就是存储在聚簇索引中的, 聚簇索引就是表 。 如果没有设置主键怎么办呢?MySQL会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键。 聚簇索引结构如下图所示: 非主键索引的叶子节点内容是主键的值。在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。 二级索引的叶子节点中存的是主键的值 ,不是原始的数据

应有尽有的MySQL 的覆盖索引与回表

我怕爱的太早我们不能终老 提交于 2020-02-25 16:11:03
两大类索引 使用的存储引擎:MySQL5.7 InnoDB 聚簇索引 * 如果表设置了主键,则主键就是聚簇索引 * 如果表没有主键,则会默认第一个NOT NULL,且唯一(UNIQUE)的列作为聚簇索引 * 以上都没有,则会默认创建一个隐藏的row_id作为聚簇索引 由此可见,使用聚簇索引查询会很快,因为可以直接定位到行记录。 普通索引 InnoDB的普通索引叶子节点存储的是主键(聚簇索引)的值,而MyISAM的普通索引存储的是记录指针。 示例 建表 mysql> create table user( -> id int( 10 ) auto_increment, -> name varchar( 30 ), -> age tinyint( 4 ), -> primary key ( id ), -> index idx_age ( age ) -> )engine=innodb charset=utf8mb4 ; id 字段是聚簇索引,age 字段是普通索引(二级索引) 填充数据 insert into user(name,age) values( '张三' , 30 ); insert into user(name,age) values( '李四' , 20 ); insert into user(name,age) values( '王五' , 40 ); insert

Mysql死锁原理分析

纵然是瞬间 提交于 2020-02-23 19:29:24
文章来自何凳成博客 1 背景 MySQL/InnoDB 的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事 咨询这方面的问题。同时,微博上也经常会收到MySQL 锁相关的私信,让我帮助解决一些 死锁的问题。本文,准备就MySQL/InnoDB 的加锁问题,展开较为深入的分析与讨论,主要 是介绍一种思路,运用此思路,拿到任何一条SQL 语句,就能完整的分析出这条语句会加 什么锁?会有什么样的使用风险?甚至是分析线上的一个死锁场景,了解死锁产生的原因。 注 :MySQL 是一个支持插件式存储引擎的数据库系统。本文下面的所有介绍,都是基于InnoDB 存储引擎,其他引擎的表现,会有较大的区别。 1.1 MVCC:Snapshot Read vs Current Read MySQL InnoDB 存储引擎,实现的是基于多版本的并发控制协议——MVCC (Multi-Version Concurrency Control) (注:与MVCC相对的,是基于锁的并发控制,Lock-Based ConcurrencyControl)。MVCC 最大的好处,相信也是耳熟能详:读不加锁,读写不冲突。在读多些少的OLTP 应用中,读写不冲突是非常重要的,极大的增加了系统的并发性能,这也是为什么现阶段,几乎所有的 RDBMS,都支持了 MVCC。 在 MVCC 并发控制中

mysql 索引的理解-针对面试

风格不统一 提交于 2020-02-12 22:55:07
innodb 索引 索引是一颗B+tree(多路平衡查询树)。 B-tree 与B+tree区别 B-tree 每个节点从小到大排序。 每个节点指向下游节点。 每个节点对应data。可以理解为mysql 表一行记录。 B+tree 非叶子节点仅存储索引,不存储data。 叶子节点存储索引,与数据。 每一个父节点都会出现在子节点上。 mysql 对B+tree 进行了优化,每一个叶子节点都带有指向下一个叶子节点的指针。 聚簇索引与非聚簇索引 聚簇索引叶子节点指向data 聚簇索引叶子节点指向主键 来源: CSDN 作者: jiguansheng 链接: https://blog.csdn.net/jiguansheng/article/details/104271020

MySQL索引

柔情痞子 提交于 2020-02-12 06:35:31
1.B树与B+树的区别? 1. B+树改进了B树, 让内结点只作索引使用, 去掉了其中指向data record的指针, 使得每个结点中能够存放更多的key, 树的层高能进一步被压缩, 使得检索的时间更短. 2. 由于底部的叶子结点是链表形式, 因此也可以实现更方便的顺序遍历 2.MySQL中HASH索引和B+树索引的区别? B+索引: B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接 在B+树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基于索引的顺序扫描时,也可以利用双向指针快速左右移动,效率非常高。 哈希索引: 哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。 两者的区别: 1. 如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;当然了,这个前提 是,键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据 2. 从示意图中也能看到,如果是范围查询检索,这时候哈希索引就毫无用武之地了,因为原先是有序的键值,经过哈希算 法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索 3. 同理

【转】MySql索引

与世无争的帅哥 提交于 2020-02-10 15:21:32
https://segmentfault.com/a/1190000010991930 索引(key)是存储引擎用于快速找到记录的一种数据结构。它和一本书中目录的工作方式类似——当要查找一行记录时,先在索引中快速找到行所在的位置信息,然后再直接获取到那行记录。 在MySql中,索引是在存储引擎层而不是服务器层实现的,所以不同的存储引擎对索引的实现和支持都不相同。 B-TREE索引 B-TREE索引是使用最多的索引。很多存储引擎采用的都是B-TREE数据结构的变体实现该索引,例如InnoDB使用的是B+TREE,即每个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点范围遍历。 不同存储引擎使用B-TREE索引的方式也不同。例如MyISAM使用前缀压缩技术使索引更小,而InnoDB则按照原数据格式进行存储。再如MyISAM索引通过数据的物理位置引用被索引的行,而InnoDB则根据主键引用被索引的行。 B-TREE中的所有值都是按顺序存储的,每个叶子页到根的距离相同。下图展示了InnoDB中的B-TREE索引是如何工作的: 当查找一行记录时,存储引擎会先在索引中搜索。从索引的根节点开始,通过比较节点页的值和要查找的值逐层进入下层节点,最底层叶子节点的指针指向的是被索引的数据。这样的查找方式避免了全表扫描,加快访问数据的速度。此外因为B-Tree对索引列是顺序存储的

suoyin

我与影子孤独终老i 提交于 2020-02-09 12:30:38
1. 什么是索引? 索引是一种数据结构,可以帮助我们快速的进行数据的查找. 2. 索引是个什么样的数据结构呢? 索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引. 3. Hash索引和B+树所有有什么区别或者说优劣呢? 首先要知道Hash索引和B+树索引的底层实现原理: hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据.B+树底层实现是多路平衡查找树. 对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据. 那么可以看出他们有以下的不同: hash索引进行等值查询更快(一般情况下),但是却无法进行范围查询. 因为在hash索引中经过hash函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询.而B+树的的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围. hash索引不支持使用索引进行排序,原理同上. hash索引不支持模糊查询以及多列索引的最左前缀匹配.原理也是因为hash函数的不可预测. AAAA 和 AAAAB 的索引没有相关性. hash索引任何时候都避免不了回表查询数据,而B+树在符合某些条件

理解聚簇索引

陌路散爱 提交于 2020-02-07 15:09:18
聚簇索引(Cluster Index)也叫索引组织表(Index-organized Table),MySQL用户经常称呼为前者。 聚簇索引并不是数据库索引的某个种类,其描述的是数据的一种存储方式 。我们知道,在InnoDB中,数据是以B+Tree的形式存储的,其特点就是数据都存储在叶子节点上,非叶子节点上只存索引信息,即key值和指向子节点的指针。这种索引和数据的存储方式就叫做聚簇索引,“聚簇”的意思就是通常来说,数据行和相邻的健挨着。 InnoDB通过主键来聚集数据,也就是说聚簇索引的B+Tree上的叶子结点所存储的key总是主键,如果没有定义主键,InnoDB会选择一个唯一的非空索引代替,如果没有这样的索引,InnoDB会隐式地定义一个主键来聚集(存储)数据,这个隐式的主键被称为rowID。 在InnoDB中,存储聚簇索引的B+Tree的叶子节点是一个数据页,默认大小为16K,这些数据页上的数据其实是一个有序链表,会按照主键递增的顺序来进行存储。在上图中,如果要访问ID为10的记录,InnoDB根据索引找到了key为11的索引,访问其左子节点,然后进行遍历(由于在一个数据页中的数据的存放位置是连续的,所以不会有多次寻址的额外开销),比较key值直到找到ID为10的记录。 对于非聚簇索引,InnoDB通常在叶子节点上存储的是数据行的主键值,命中非聚簇索引时

SQL索引

牧云@^-^@ 提交于 2020-02-06 12:31:02
索引 索引概念、索引模型 索引是一种数据结构,能够帮助我们快速的检索数据库中的数据 数据结构:Hash索引和B+树 优缺点 Hash索引低层是哈希表,哈希表是一种KV存储数据的结构,数据存储上没有任何顺序,区间查询无法直接通过索引,可以做等值查询,不支持最左匹配规则。如果存在大量重复键,哈希索引效率会很低,存在哈希碰撞问题 B+ Tree是一种多路平衡查询树,节点天然有序,叶子节点存储了整行数据的事主键索引,也被称为聚簇索引,叶子节点存储主键的值的是为非聚簇索引。 聚簇索引和非聚簇索引的区别 聚簇索引:叶子节点查询出来的是整行数据 非聚簇索引:叶子节点查询出来的是主键的值,得到值之后还要通过主键的值再查询一次,也可以通过覆盖索引查询一次 联合索引、最左前缀匹配 在做联合索引的时候,将识别度最高的字段放在最左边(将where字句中使用最频繁的一列放在最左边) 最左匹配规则:如(key1,key2,key3)相当创建了(key1)(key1,key2)(key1,key2,key3) 通过explain查看sql语句的执行计划 注:查询优化器,可能使查询语句没有通过索引 来源: CSDN 作者: 姜_白 链接: https://blog.csdn.net/weixin_41730409/article/details/104192068