首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

MySQL InnoDB创建索引

1.基本概念 1.1 聚簇索引 InnoDB索引基于B+树实现,每张InnoDB的表都有一个特殊的索引,叫做聚簇索引(Clustered Index),聚簇索引存储了表中的真实数据。...聚簇索引的创建方式一般有三种: 用户定义了主键,那么InnoDB依据主键创建聚簇索引 用户没有定义主键,那么InnoDB根据表上的第一个唯一非空的列创建聚簇索引 如果以上两条都不符合,那么InnoDB会自动指定一个系统列作为聚簇索引...1.3 InnoDB系统列 InnoDB在创建表的时候,除了用户自定义的列之外,还会额外地增加几个隐藏的列,这些列在MySQL Server看来是不可见的,我们称之为系统列。...2.2 重启后创建索引 MySQL重启后,内部索引对象丢失,需要在启动后重新创建相关的索引MySQL重启后首先会将数据字典内的信息进行读取和初始化,然后根据数据字典的信息进行索引的创建。...还是以上文的表t为例,假设现在MySQL重启,如何在t上构建索引? step1: 创建聚簇索引 无论如何,聚簇索引都会第一个创建。

5.6K30

Mysql-innodb-B+索引

写在最前 这是读书笔记,Mysqlinnodb系列一共3篇。...Mysql-innodb-B+索引(本篇) Mysql-innodb-锁(预计20200523) Mysql-innodb-事务预计20200530) 概述 下面是常见的建表语句: CREATE...DEFAULT CHARSET=utf8mb4 其中的Key和PRIMARY就是 B+树索引,即常用的索引,大概率是B+树索引 注:mysql还有全文索引和hash索引。...,将新表重命名 辅助索引(FIC机制) 表上加S锁,不用重建表,标记删除 允许读,阻塞写 注:关于锁的部分见下一篇blog:Mysql-innodb-锁 Cardinality 一个参数看索引好坏...如果待排序的内容不能由所使用的索引直接完成排序的话,那么mysql有可能就要进行文件排序 Using filesort。 经过测试证明了,聚合索引的排序方式。 尽量利用聚合索引的排序方式,优化查询。

2.3K00
您找到你想要的搜索结果了吗?
是的
没有找到

MySQL InnoDB索引:存储结构

InnoDB表结构 此小结与索引其实没有太多的关联,但是为了便于理解索引的内容,添加此小结作为铺垫知识。...1.1 InnoDB逻辑存储结构 MySQL表中的所有数据被存储在一个空间内,称之为表空间,表空间内部又可以分为段(segment)、区(extent)、页(page)、行(row),逻辑结构如下图:...聚簇索引和二级索引 3.1 聚簇索引 每个InnoDB的表都拥有一个索引,称之为聚簇索引,此索引中存储着行记录,一般来说,聚簇索引是根据主键生成的。...聚簇索引按照如下规则创建: 当定义了主键后,InnoDB会利用主键来生成其聚簇索引; 如果没有主键,InnoDB会选择一个非空的唯一索引来创建聚簇索引; 如果这也没有,InnoDB会隐式的创建一个自增的列来作为聚簇索引...参考资料 《 MySQL技术内幕-InnoDB存储引擎》:此书对于InnoDB的讲解是比较全面而且细致的,但是稍微有一点点老并且还有一点点错误地方,此书是基于 MySQL 5.6版本的,里边会混杂一些5.7

1.1K20

MySQL InnoDB索引的存储结构

InnoDB索引的数据结构 InnoDB索引采用了B-Tree的数据结构,数据存储在叶子节点上,每个叶子节点默认的大小是16KB。...当新记录插入到InnoDB聚簇索引中时,如果按顺序插入索引记录(升序或降序),当达到叶子节点最大的容量时,下一条记录就会写到新的的页中。...你可以设置 innodb_page_size 来调整页的大小,支持 64KB, 32KB, 16KB (默认), 8KB, 和4KB。 索引的分类 InnoDB索引类型分为主键索引和非主键索引。...MySQL会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键。 聚簇索引结构如下图所示: 非主键索引的叶子节点内容是主键的值。...在 InnoDB 里,非主键索引也被称为二级索引(secondary index)。

85620

MySQL InnoDB索引介绍及优化

索引值对应的是主键ID 二、如何找到索引对应的值 InnoDB引擎主要根据 (1)B+tree (2)二分查找法 ?...如上图InnoDB表是聚簇表,意思是InnoDB本身是一张大的索引组织表,也是一个根据主键排序的大索引的B+树结构,我们在InnoDB里面另外建立自己想要索引的表的字段 聚簇索引就意味着InnoDB表本身...,而我们把这些根据其他字段排序的索引称为二级索引(secondery class) 四、在数据库中如何建立索引MySQL中主要建立两种类型的索引 1.单列索引 create index idx_name...,因此在DML中,插入等操作不再是普通的插入,MySQL将它封装成了一个事务,连着索引项的排序表一起操作 因此,我们应当严格控制表上的索引数量,否则容易影响数据库的性能 总结索引维护如下: 1、索引维护由数据库自动完成...; ->正确 (注:需要MySQL5.6版本以上;在5.5及以前版本,可以对a字段进行索引扫描,但c字段不行) where a=? and b=? and c=?

94610

MySQLInnoDB索引深入剖析

我的博客: https://www.luozhiyun.com/archives/273 InnoDB页 将数据划分为若干个页,以页作为磁盘和内存之间交互的基本单位,InnoDB中页的大小一般为 16...这个目录有一个别名,称为索引InnoDB中的索引方案 在InnoDB中复用了之前存储用户记录的数据页来存储目录项,为了和用户记录做一下区分,我们把这些用来表示目录项的记录称为目录项记录。...这种聚簇索引并不需要我们在MySQL语句中显式的使用INDEX语句去创建(后边会介绍索引相关的语句),InnoDB存储引擎会自动的为我们创建聚簇索引。...另外有趣的一点是,在InnoDB存储引擎中,聚簇索引就是数据的存储方式(所有的用户记录都存储在了叶子节点),也就是所谓的索引即数据,数据即索引。 二级索引 ?...主键插入顺序 对于一个使用InnoDB存储引擎的表来说,在我们没有显式的创建索引时,表中的数据实际上都是存储在聚簇索引的叶子节点的。

69910

MySQL哈希索引以及InnoDB自适应哈希索引

专栏持续更新中:MySQL详解 一、哈希索引 哈希索引是基于内存的支持,底层结构就是链式哈希表,增删改查的时间复杂度都是O(1),一断电就没了,因为内存搜索,哈希表是最快的 而平衡树的增删改查的时间复杂度是...看起来哈希表比B+树好,那为什么MyISAM和InnoDB存储引擎用的是B+树索引?...,故不适用于多数的应用场景,比如范围、模糊、排序等等 此外一旦哈希表扩容,就会导致所有的索引值重新计算存储位置,效率很低 二、InnoDB自适应哈希索引 自适应哈希索引作用:MySQL Server为避免频繁回表...:如果检测到某个二级索引不断被使用,二级索引成为热数据,那么InnoDB会根据在二级索引树上的索引值在构建一个哈希索引来加速搜索(只适用于等值比较) 图中蓝色的箭头表示不建立哈希索引,搜索二级索引树然后回表的过程...,我们可以查看相关参数指标,如果自适应哈希索引可以提高效率,那我们使用它,否则我们就关闭它 自适应哈希索引是默认开启的: 在MySQL5.7以前,操作哈希表是只有一把锁的,锁的粒度太大,效率很低。

26920

www.xttblog.com MySQL InnoDB 索引原理

InnoDBMySQL最常用的存储引擎,了解InnoDB存储引擎的索引对于日常工作有很大的益处,索引的存在便是为了加速数据库行记录的检索。...InnoDB表结构 此小结与索引其实没有太多的关联,但是为了便于理解索引的内容,添加此小结作为铺垫知识。...1.3 InnoDB数据页结构 《 MySQL技术内幕-InnoDB存储引擎》书中对此有描述,但是应该不是太准确,书中有如下描述,此处不做详细介绍,若有兴趣请看此神书。 ? 2....聚簇索引按照如下规则创建: 当定义了主键后,InnoDB会利用主键来生成其聚簇索引; 如果没有主键,InnoDB会选择一个非空的唯一索引来创建聚簇索引; 如果这也没有,InnoDB会隐式的创建一个自增的列来作为聚簇索引...参考资料 《 MySQL技术内幕-InnoDB存储引擎》:此书对于InnoDB的讲解是比较全面而且细致的,但是稍微有一点点老并且还有一点点错误地方,此书是基于 MySQL 5.6版本的,里边会混杂一些5.7

1.1K50

MySQLInnoDB引擎的辅助索引扩展

/rjzheng/p/9915754.html MySQL InnoDB索引原理 InnoDB索引实现 · MySQL索引背后的数据结构及算法原理 · 看云 InnoDB索引实现 关于MySQL...InnoDB表的二级索引是否加入主键的总结_ITPUB博客 关于MySQL InnoDB表的二级索引是否加入主键的总结 https://www.jb51.net/article/154305.htm...MySQL InnoDB 二级索引的排序示例详解 关于MySQL InnoDB表的二级索引是否加入主键列的问题解释_My DBA life的技术博客_51CTO博客_了解MySQL InnoDB...表的二级索引是否加入主键列 关于MySQL InnoDB表的二级索引是否加入主键列的问题解释 关于MySQL InnoDB表的二级索引是否加入主键列的问题解释-布布扣-bubuko.com MySQL...InnoDB 二级索引的排序示例详解 MySQL5.6之use_index_extensions优化 | DBA的罗浮宫 MySQL5.6之use_index_extensions优化

97520

MySQLInnoDB引擎对索引的扩展

摘要:InnoDB引擎对索引的扩展,自动追加主键值及其对执行计划的影响。 MySQL中,使用InnoDB引擎的每个表,创建的普通索引(即非主键索引),都会同时保存主键的值。...; 创建了t1表,其主键为(i1, i2),同时创建了基于d列的索引k_d,但其实在底层,InnoDB引擎将索引k_d扩展成(d,i1,i2)。...InnoDB引擎这么做,是用空间换性能,优化器在判断是否使用索引及使用哪个索引时会有更多列参考,这样可能生成更高效的执行计划,获得更好的性能。...下面仅示意走k_d索引的情况: mysql> EXPLAIN SELECT COUNT(*) FROM t1 WHERE i1 = 3 AND d = '2000-01-01'\G **********...使用MyISAM引擎的t1myisam表,Handler_read_next值为5,使用InnoDB引擎的t1表,Handler_read_next值减小到1,就是因为InnoDB引擎对索引进行了主键扩展

1.2K10

MySQL InnoDB表和索引之聚簇索引与第二索引

每个InnoDB表都有一个称之为聚簇索引(clustered index)的特殊索引,存储记录行数据。通常,聚簇索引和主索引是近义的。...为每个表都定义一个主键,如果没有逻辑上唯一且NOT-NULL的列,则添加一个自动增长(auto-increment)的列 l 如果没为表定义主键,mysql定位所有索引列都为NOT NULL的第一个唯一索引...l 如果表没有主键或合适的唯一索引InnoDB会在某个包含row ID值的合成列上生成一个隐藏的聚簇索引。记录行按表中InnoDB赋予行的row ID排序。...二级索引(secondary index)和聚簇索引的关系 除了聚簇索引外的索引,都叫二级索引InnoDB中,每个二级索引条目都包含主键列。InnoDB使用主键值来搜索聚簇索引中的记录。...参考连接: http://dev.mysql.com/doc/refman/5.5/en/innodb-index-types.html

1.1K10

MySQL索引底层(三)--InnoDB中的锁

行锁,表锁 InnoDB存储引擎中有行锁以及表锁,行锁是InnoDB中默认的锁。 表锁:对整张表进行加锁,在同一时刻整张表的所有记录都被锁住。...当我们执行update的时候,是update 字段a=1的 所以我们在update字段a=2的时候,虽然没有提交事务但是还是可以执行的,这里证明了InnoDB是行锁的。...注意:行锁必须有索引才能实现,否则就会自动锁住全表,也就是表锁,而InnoDB当有主键的时候,自动就会创建主键索引。 行锁与表锁的区别 行锁 优点 :粒度小, 因为加锁的只是一行数据。...锁的优化: 合理设计索引 减少基于范围的数据检索过滤条件 尽量控制事务的大小,尽量使用较低的事务隔离级别 尽可能让所有的数据检索都通过索引来完成。

51711

Mysql InnoDB 为啥选择B+树索引

前言 Mysql数据库中的常见索引有多种方式,例如Hash索引,B-树索引,B+树索引,但是为啥mysql中默认是采用B+树索引索引呢?下面对这三种索引学习总结一下。B+树到底有啥优势?...哈希索引 哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。...从上面的图来看,B+树索引和哈希索引的明显区别是:     如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;当然了,这个前提是,键值都是唯一的。...,就没办法再利用索引完成范围查询检索;     哈希索引也没办法利用索引完成排序,以及like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询);     哈希索引也不支持多列联合索引的最左匹配规则...;     B+树索引的关键字检索效率比较平均,不像B树那样波动幅度大,在有大量重复键值情况下,哈希索引的效率也是极低的,因为存在所谓的哈希碰撞问题。

62830

MySQLInnoDB(下)-B+树与索引

MySQL支持多种存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。 本节主要以InnoDB存储引擎为例来说明。...InnoDB 存储引擎在绝大多数情况下使用 B+ 树建立索引,这是关系型数据库中查找最为常用和有效的索引,下面就讲一下为什么B+树索引常用且高效。...参考资料: cnblogs:B树和B+树的总结: http://www.cnblogs.com/George1994/p/7008732.html 浅入浅出MySQLInnoDB: https://draveness.me.../mysql-innodb CSDN;深入理解索引B+树存储: CNBLOGS:InnoDB索引原理: https://www.cnblogs.com/George1994/p/7324759.html...oschina:聚集索引与非聚集索引: https://my.oschina.net/osenlin/blog/287558 CSDN:浅析聚集索引: 《MySQL技术内幕:InnoDB存储引擎》 第五章

85680

InnoDB索引,终于懂了

MySQL有限的缓冲区,存储的索引与数据会减少,磁盘IO的概率会增加。...常见的解决方案是覆盖索引。 什么是索引覆盖(Covering index)? 额,楼主并没有在MySQL的官网找到这个概念。 画外音:治学严谨吧? 借用一下SQL-Server官网的说法。 ?...MySQL官网,类似的说法出现在explain查询计划优化章节,即explain的输出结果Extra字段为Using index时,能够触发索引覆盖。 ?...不管是SQL-Server官网,还是MySQL官网,都表达了:只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。 如何实现索引覆盖?...; (4)InnoDB的聚集索引存储数据行本身,普通索引存储主键; (5)InnoDB不宜使用较长的列作为PK; (6)InnoDB普通索引可能存在回表查询,常见的解决方案是覆盖索引; 作业: 频繁插入的场景

1.4K40

InnoDB(5)索引页 --mysql从入门到精通(十)

InnoDB(4)行溢出--mysql从入门到精通(九) 回忆一下: 前面我们知道了查询一条数据,需要先tcp/ip先客户端链接服务端,之后会查询缓存,有的话直接返回,insert 和update都会让缓存失效...而存储引擎innoDB存储分为几个部分,变长字段长度列表,null值列表,头部信息列表,之后就是真实存储数据列表,当数据太多,就会分页存储,每页大概16kb。...存放我们表中记录类型的页,官方称为INDEX页(索引页),这些表中的内容就是我们日常存储的数据,所以又称为数据页。...innoDB数据页16kb大小存储空间可以划分为多个部分,不同部分有着不同的功能, File Header:38个字节,文件头部,页的一些通用信息。...N_owned:一两句说不清,后面着重会详细介绍,稍安勿躁,铁汁们~ Heap_no:存储当前数据在当前页的索引地址,那为什么从2开始呢,0和1在哪,因为innoDB默认会给每个页自动添加两条虚拟数据,

36840

mysql 中的innoDB 引擎的B+树索引

InnoDB索引概述 innoDB存储引擎支持的索引有: B+树索引 全文索引 哈希索引 在这需要注意的是InnoDB存储引擎支持的hash索引是自适应的,innoDB会根据表的情况自动生成hash索引...非聚集索引 叶子结点不包含行记录,包含对应索引创建的建值外还有一个book’mark,该书签用来告诉innoDB存储引擎哪里可以找到与索引相对应的行数据。...索引的类型,innoDB只支持B+树索引是Btree Comment 注释 CArdinaility的值非常重要,优化器在选择索引的时候会参考本值。...innoDB索引都是B+Tree索引, B+树为磁盘读取而生,他是由B树索引演化而来的,BTree是通过AVL树演化而来的 innoDB的B+树索引分为聚集索引和非聚集索引,聚集索引每个表只有一个,非聚集索引可以有多个...参考 《innoDB技术内幕》 《大话数据结构》

90630

MySQL索引底层实现原理 & MyISAM非聚簇索引 vs. InnoDB聚簇索引

MySQL索引底层实现原理 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。...在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。...InnoDB索引实现 虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。 第一个重大区别是InnoDB的数据文件本身就是索引文件。...因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,...则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整型。

1.3K20

Mysql | innodb

比如从 1 到 7 升序插入数据节点,如果是普通的二叉查找树则会退化成链表,但是红黑树则会不断调整树的形态,使其保持基本平衡状态 B 树用作数据库索引有以下优点: 优秀检索速度,时间复杂度:B 树的查找性能等于...第一,B 树一个节点里存的是数据,而 B+树存储的是索引(地址),所以 B 树里一个节点存不了很多个数据,但是 B+树一个节点能存很多索引,B+树叶子节点存所有的数据。...Innodb 创建表后生成的文件有: frm:创建表的语句 idb:表里面的数据+索引文件 较频繁的作为查询条件的字段应该创建索引; 唯一性太差的字段不适合单独创建索引,即使该字段频繁作为查询条件; 更新非常频繁的字段不适合创建索引

91610
领券