FIC(Fast index creation)特性
在MySQL 5.5版本中引入FIC(Fast index creation)特性,创建索引时无需再拷贝整表数据,以提升索引的创建速度。

FCI 操作流程:
(1)对表加共享S锁,允许其他会话读操作,但禁止写操作,
(2)扫描Cluster index的数据来构建新索引
(3)新索引创建完成,解除S锁,允许读写。

FCI 优点:
(1)创建索引不需要拷贝整表数据,创建速度快,
(2)创建索引过程中,可以快速中止。

FCI限制:
(1)FCI特新仅限于复制索引,不试用于聚集索引,
(2)索引创建期间,表只允许读不允许写。

Online DDL特性
在MySQL 5.6.7中引入Online DDL特性,通过Row Log记录DDL操作前期的数据变化并在DDL操作后期进行“重放”,使得整个DLL操作期间仅需要短暂的表锁。

Online create index流程
(1)扫描Cluster Index的数据来构建新索引
(2)使用RowLog来记录构建新索引中的数据变化
(3)锁定表禁止写,重放Rowlog到新索引上
(4)索引创建完成,新索引数据和Cluster Index数据保持一致,释放表锁。

Online DDL优点:
(1)在整个创建索引周期内,大部分时间原表可读写。

Bulk load for create index特性
在MySQL 5.7.5版本中引入Bulk load for create index特性,通过bulk load方式替换原有单行插入方式,大幅提升索引创建速度。

操作流程:
(1)扫描Cluster Index数据,将数据放入sort buffer中排序,soft buffer写满后将数据写入临时文件
(2)对临时文件中的有序记录进行归并排序
(3)将排序后的数据写入到索引结构中,自下而上生产索引树。

非bulk load方式的缺点:
(1)排序效率,需要对每行数据在新索引中进行查找定位,确定该行数据的索引位置,定位需要从索引的根节点开始查找到索引的叶子节点。
(2)redo log,需要使用redo log来记录每行数据插入索引所产生的数据变化。
(3)undo log,需要使用undo log来记录每行数据的位置
(4)索引碎片和页拆分,随着数据行的不断插入,很容易导致索引页的拆分和索引树的自平衡,无法保证索引页的填充度。

bulk load方式的优点:
(1)排序效率,数据在sort buffer和临时文件中牌序合并,然后直接生成索引的叶子节点页,无需单独定位每行数据的位置。
(2)redo log,使用checkpoint来持久化生成的索引页,不会产生redo log。
(3)undo log,仅需要使用undo log来记录索引页的分配情况,产生的undo log较少。
(4)可以按照innodb_fill_factor参数来生成索引页,且不会导致页拆分,索引树需要平衡的次数较少。

bulk load方式的缺点:
(1)bulk load使用临时文件来存放sort buffer的结果,需要关注磁盘空间的使用率
(2)bulk load不产生redo log,数据库从write-ahead logging方式退化成direct persist data,导致依赖redo log实现的工具失效,如xtrabackup。
(3)bulk load需要不断地唤醒page cleaner线程来对新索引页进行checkpoint操作。
(4)仅支持普通索引和全文索引,不支持空间索引。

参考资料:
https://dev.mysql.com/doc/refman/5.7/en/sorted-index-builds.html
https://dev.mysql.com/worklog/task/?id=7277
https://yq.aliyun.com/articles/50758

MySQL Index--CREATE INDEX在各版本的优化的更多相关文章

  1. MySQL Backup--xtrabackup与Bulk Load for Create Index

    场景描述:主从使用MySQL 5.7.19 1.从库上使用xtrabackup进行热备. 2.主库行执行DDL创建索引: ALTER TABLE `tb_xxx` ADD INDEX idx_good ...

  2. How MySQL Uses Indexes CREATE INDEX SELECT COUNT(*)

    MySQL :: MySQL 5.7 Reference Manual :: 9.3.1 How MySQL Uses Indexeshttps://dev.mysql.com/doc/refman/ ...

  3. MySQL 创建索引(Create Index)的方法和语法结构及例子

    MySQL 创建索引(Create Index)的方法和语法结构及例子 MySQL 创建索引(Create Index)的方法和语法结构及例子   CREATE INDEX Syntax CREATE ...

  4. mysql 添加索引,ALTER TABLE和CREATE INDEX的区别

    nvicat-->mysql表设计-->创建索引. (1)使用ALTER TABLE语句创建索引,其中包括普通索引.UNIQUE索引和PRIMARY KEY索引3种创建索引的格式: PRI ...

  5. mysql 索引查询 、创建 create index 与 add index 的区别

    1.索引查询 ------TABLE_SCHEMA  库名:TABLE  表名 ------AND UPPER(INDEX_NAME) != 'PRIMARY'  只查询索引,不需要主键 SELECT ...

  6. 关于mysql的loose index scan的几点疑问

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/102 关于MySQL的loose index scan有几点疑问 ...

  7. MySQL 执行计划中Extra(Using where,Using index,Using index condition,Using index,Using where)的浅析

      关于如何理解MySQL执行计划中Extra列的Using where.Using Index.Using index condition,Using index,Using where这四者的区别 ...

  8. MySQL--CREATE INDEX在各版本的优化

    在MySQL 5.5版本中引入FIC(Fast index creation)特性,提升索引的创建速度. FCI 操作流程: (1)对表加共享S锁,允许其他会话读操作,但禁止写操作, (2)扫描Clu ...

  9. MySQL 5.6 Index Condition Pushdown

    ICP(index condition pushdown)是mysql利用索引(二级索引)元组和筛字段在索引中的where条件从表中提取数据记录的一种优化操作.ICP的思想是:存储引擎在访问索引的时候 ...

随机推荐

  1. NTP时钟同步配置

    NTP在Linux下有两种时钟同步方式: 直接同步(也称跳跃同步)和平滑同步(也称微调同步). 直接同步 使用ntpdate命令进行同步,直接进行时间变更. 如果服务器上存在一个12点运行的任务,当前 ...

  2. [图片问答]LODOP字体设置方法

    字体设置方法:一.整体设置(针对文本项),打印初始化后.增加打印项之前调用本函数LODOP.SET_PRINT_STYLE("FontSize",11);二.单个打印项(针对文本项 ...

  3. [LeetCode] 675. Cut Off Trees for Golf Event 为高尔夫赛事砍树

    You are asked to cut off trees in a forest for a golf event. The forest is represented as a non-nega ...

  4. powershell字符串操作

    字符串操作是powershell中重要的一项操作,学会使用字符串操作的一些常用方法会大大提高脚本编写效率,以下列出几个经常用到的字符串操作方法: 前提:本人的powershell版本是 1.字符串格式 ...

  5. Bazel安装及使用入门

    Bazel [文档][https://docs.bazel.build/versions/1.1.0/bazel-overview.html] MacOS安装 brew tap bazelbuild/ ...

  6. LumiSoft 邮件操作删除(无法删除解决方法)

    最近在用 LumiSoft  进行邮件读取,然后操作相关附件邮件使用的是qq邮箱,读取后进行移除,但是怎么都移除不了 后来咨询了官方客服,原来是设置不对 需要 取消掉 X禁止收信软件删信 (仅对 PO ...

  7. Influx Sql系列教程零:安装及influx-cli使用姿势介绍

    influxdb 时序数据库,因为实际业务中使用到了,然而并没有发现有特别好的文章,完整的介绍influx sql的使用姿势,因此记录下实际开发中学习的体会,主要参考来自于官方文档 Influx Qu ...

  8. was8.5调用HttpPost使用httpClient-4.5.1.jar与was原生自带jar包冲突

    一.更换jar方法. 1.将httpClient4.5.1.jar包去掉,更换使用commons-httpclient-3.1.jar. 2.更换方法,将HttpPost类转换为PostMethod类 ...

  9. while 语句的逻辑

    # i =3# username = '大天天'# password = 123# while i > 0:# name = input('请输入你的名字:')# i -= 1# if name ...

  10. Mac上go的下载安装教程

    mac上go的下载安装教程 官网https://golang.google.cn/dl/下载,安装 环境变量配置 参考https://www.jianshu.com/p/5c1873eaf3ca Ba ...