首页
学习
活动
专区
工具
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索引重建?如何操作?

,针对MySQL数据库,不像Oracle数据库中有支持索引重建的语法(ALTER INDEX … REBUILD),在MySQL数据库中,重建索引具体有哪些方案呢?...对于InnoDB存储引擎的表而言,对应的索引数据存储在ibd文件中,所以文件的创建时间或修改时间是间接判断索引创建时间。如果存储引擎为MyISAM的话,还有专门的索引文件MYI。...其实等价于REBUILD表(REBUILD表就是重建表的意思),所以索引也等价于重新创建了。...TABLE也可以对索引进行重建,官方文档的介绍如下: OPTIMIZE TABLE uses online DDL for regular and partitioned InnoDB tables,...,经过测试,发现ANALYZE TABLE是不会对索引进行重建的,发现ibd文件没有变化,表的修改时间/状态更改时间也没有变化。

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

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),逻辑结构如下图:...聚簇索引按照如下规则创建: 当定义了主键后,InnoDB会利用主键来生成其聚簇索引; 如果没有主键,InnoDB会选择一个非空的唯一索引来创建聚簇索引; 如果这也没有,InnoDB会隐式的创建一个自增的列来作为聚簇索引...当插入的主键是随机字符串时,每次插入不会是在B+树的最后插入,每次插入位置都是随机的,每次都可能导致数据页的移动,而且字符串的存储空间占用也很大,这样重建索引不仅仅效率低而且 MySQL的负载也会很高,...参考资料 《 MySQL技术内幕-InnoDB存储引擎》:此书对于InnoDB的讲解是比较全面而且细致的,但是稍微有一点点老并且还有一点点错误地方,此书是基于 MySQL 5.6版本的,里边会混杂一些5.7

1.1K20

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=?

93510

MySQL InnoDB索引的存储结构

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

85520

MySQLInnoDB索引深入剖析

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

69310

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

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

25320

www.xttblog.com MySQL InnoDB 索引原理

InnoDBMySQL最常用的存储引擎,了解InnoDB存储引擎的索引对于日常工作有很大的益处,索引的存在便是为了加速数据库行记录的检索。...1.3 InnoDB数据页结构 《 MySQL技术内幕-InnoDB存储引擎》书中对此有描述,但是应该不是太准确,书中有如下描述,此处不做详细介绍,若有兴趣请看此神书。 ? 2....聚簇索引按照如下规则创建: 当定义了主键后,InnoDB会利用主键来生成其聚簇索引; 如果没有主键,InnoDB会选择一个非空的唯一索引来创建聚簇索引; 如果这也没有,InnoDB会隐式的创建一个自增的列来作为聚簇索引...当插入的主键是随机字符串时,每次插入不会是在B+树的最后插入,每次插入位置都是随机的,每次都可能导致数据页的移动,而且字符串的存储空间占用也很大,这样重建索引不仅仅效率低而且 MySQL的负载也会很高,...参考资料 《 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优化

96820

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

Elasticsearch 重建索引

这时,配置分词库只是第一步操作,因为大量的历史数据在索引时并没有使用新添加的分词库,将导致查询出现不可预期的效果。 此时,我们需要做的就是重建索引。 2....重建索引的使用场景 至少在以下场景需要重建索引。 2.1. 生成索引方式变更 如上所述,因为新的词库的添加,导致历史数据需要按照新的索引生成方式来生成索引。 此时,重建索引就是唯一的选择了。...切分数据 对于已有 ES 集群,数据量庞大到一定程度或因为其他业务上的原因,往往需要将已有数据按照一定的规则进行切分到多个不同的索引中。 这样的过程通过重建索引来实现是非常容易得。...此时也是不得不进行索引的删除重建工作的。 3. 重建索引的过程 对于线上业务来说,我们不能简单暴力地删除已有索引 -> 创建新索引 -> 导入数据的方式来重建索引,这样将严重影响到业务的使用。...正确的流程是: 创建新索引 批量从原索引中将数据导出到新索引中 数据导入完成后,通过 ES 别名机制进行索引切换 删除旧索引 这样就实现了索引的平滑重建。 4.

99330

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

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

51311

Mysql InnoDB 为啥选择B+树索引

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

61930

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存储引擎》 第五章

85080

RabbitMQ--索引重建

在这种情况下,日志文件中可以看到如下类似的日志信息: 从日志的字面意思来看是需要进行索引重建工作,那么,什么时候需要进行索引重建,什么时候不需要进行索引重建索引重建具体是怎样进行的呢?...【索引重建相关的文件】 在rabbitmq中,持久化消息存储在后缀为rdq的文件中(msg_store的存储方式),消息在队列中的位置(索引)存储在后缀为idx的文件中(消息也可能直接存储在索引文件中,...;否则,则需需要遍历读取所有的消息文件(*.rdq)、队列的索引文件(*.idx)来完成索引重建工作。...这种情况下,recovery文件会加载失败,因此就需要遍历所有的消息文件与队列索引文件进行索引重建。 在分析相关源码后,发现,这种情况下的索引重建,队列索引文件(*.idx)会被读取两次。...【总结】 尽可能优雅(正常)的关闭rabbitmq,这样启动时就不会有索引重建的耗时工作了。

62720

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
领券