MySQL-8.0.x 新特性之索引页合并
【背景】
索引的重要是在些不表、在这里我想说的另一个问题;索引和数据一样在innodb中都是以page的形式来组织的,那么问题就来了。
比如果说索引 ix_person_name 的内容只要8个页面就能完整的保存下来,如果这个时候一条insert语句来了,由于索引的8个
页面都是满的、我们只能在新的页面中保存这条insert(所插入数据)的索引。
1): 如果insert插入数据的索引值比当前的都要大或是都要小,那么新的索引页面只要加入到列表的尾部或首部就行了,这两种情况
相对来说还是比较“廉价”的。
2): 如果insert插入数据的索引在已有索引之间,也就是说它比最小的大、但是比最大的小。这个就要对索引页面做“裂解”了,这个
这个就相对来说比较“重”了。
【问题在哪里】
之所以引起“裂解”是因为在索引页面适当的位置上没有空间可以用来保存键值关系了,为了防止把页面写满使得最后要做“裂解”,数据库
引入了一个“填充因子”的概念,比如说填充因子设置为80%就是说当页面中的空间80%都已经写入数据之后就可以为索引分配新的页面
了,不要等到页面空间用完。 这个就是期望通过多个相对“廉价”的操作来避免“重”的操作。
【副作用也不小】
由于“填充因子”是80%所以之前8个页面就可以保存下来的内容现在用了10个页面,由于操作是以页面为单位的所以最“糟糕”的情况下
数据库的多了20%的开销(当然事实上并没有这么多、这只是从页面数据数量这个维度来说的)。
以上所说的还不是全部、通常真实的填充率不太可能有80%;比如说在经历过一段时间的oltp之后,有一些数据被删除了,所以这些
数据所对应的索引内容也会被回收、这些内容之前占的空间可能就是先放着等着后面的重用。
假设数据量没有变多少,可以实际上的填充率由之前的80%下降到了10%,极端数据库的工作量又增加了。
总的来说索引在页面中排列的越是“紧密”对于读来说它可以明显的减小开销,但是这个会增大写的开销。之前DBA只能“暗中观察”,
不能“有所作为”,但是MySQL-8.0.x版本下变天了;DBA可以在一定程序上左右“历史的进程”!
【手段】
在mysql-8.0.x中DBA可以指定索引页面合并的阀值,比如说把阀值设置为50%也就是说当相邻的两个索引页面,当他们的填充率
都小于或等于50%的情况下就可能把这两个页面合并成一个页面。也就是说索引页面合并有利于“读”操作
【例子】
假设我们有一个person表并把name列的索引的合并阀值设置为45%,birthday列索引的阀值设置为48%
use tempdb; create table person(id int not null auto_increment primary key,
name varchar(16),
birthday datetime default now()); create index ix_person_name on tempdb.person(name) comment 'MERGE_THRESHOLD=45'; create index ix_person_birthday on tempdb.person(birthday) comment 'MERGE_THRESHOLD=48';
1): MERGE_THRESHOLD 是以comment的形式体现在SQL中的、MySQL并没有为它单开一个子句
2): MERGE_THRESHOLD 只能是大写的小写的话会被“无视”
【可以从information_schema中查询索引页的合并阀值】
select * from INNODB_INDEXES where name in ('ix_person_name','ix_person_birthday') ;
+----------+--------------------+----------+------+----------+---------+-------+-----------------+
| INDEX_ID | NAME | TABLE_ID | TYPE | N_FIELDS | PAGE_NO | SPACE | MERGE_THRESHOLD |
+----------+--------------------+----------+------+----------+---------+-------+-----------------+
| 147 | ix_person_name | 1059 | 0 | 2 | 5 | 2 | 45 |
| 148 | ix_person_birthday | 1059 | 0 | 2 | 6 | 2 | 48 |
+----------+--------------------+----------+------+----------+---------+-------+-----------------+
2 rows in set (0.01 sec)
----
MySQL-8.0.x 新特性之索引页合并的更多相关文章
- MySQL 8.0 InnoDB新特性
MySQL 8.0 InnoDB新特性 1.数据字典全部采用InnoDB引擎存储,支持DDL原子性.crash safe,metadata管理更完善 2.快速在线加新列(腾讯互娱DBA团队贡献) 3. ...
- 《转》MySQL 5.7版本新特性连载
MySQL 5.7版本新特性连载(一) 本文将和大家一起分享下5.7的新特性,不过我们要先从即将被删除的特性以及建议不再使用的特性说起.根据这些情况,我们在新版本及以后的版本中,应该不再使用,避免未来 ...
- paip.php 5.0 5.3 5.4 5.5 -6.0的新特性总结与比较
paip.php 5.0 5.3 5.4 5.5 -6.0的新特性总结与比较 PHP5的新特性 2 · 对象的参照过渡是默认的(default) 3 · 引入访问属性的限制 3 · 引入访问方法的限 ...
- MySQL 5.7 GA 新特性
转载自: http://www.chinaxing.org/articles/Database/2015/10/23/2015-10-22-mysql-5.7.html sys-schema http ...
- C# 6.0/7.0 的新特性
转眼C#语言都已经迭代到7.0版本了,很多小伙伴都已经把C# 7.0 的新特性应用到代码中了,想想自己连6.0的新特性都还很少使用,今天特意搜集了一下6.0和7.0的一些新特性,记录一下,方便查阅. ...
- 《MySQL 5.7 Replication新特性》分享之互动问题解答
原创 2016-07-21 宋利兵 MySQL中文网 分享主题 <MySQL 5.7 Replication新特性> 嘉宾介绍 宋利兵,MySQL研发工程师.2009年加入MySQL全球研 ...
- php5.3到php7.0.x新特性介绍
<?php /*php5.3*/ echo '<hr>'; const MYTT = 'aaa'; #print_r(get_defined_constants()); /* 5.4 ...
- NodeJS 框架 Express 从 3.0升级至4.0的新特性
NodeJS 框架 Express 从 3.0升级至4.0的新特性 [原文地址:√https://scotch.io/bar-talk/expressjs-4-0-new-features-and-u ...
- 相比于python2.6,python3.0的新特性。
这篇文章主要介绍了相比于python2.6,python3.0的新特性.更详细的介绍请参见python3.0的文档. Common Stumbling Blocks 本段简单的列出容易使人出错的变动. ...
随机推荐
- js后退
history.back(-1):直接返回当前页的上一页,数据全部消息,是个新页面 history.go(-1):也是返回当前页的上一页,不过表单里的数据全部还在 history.back(0) 刷新 ...
- 019 spark on yarn(Job的运行流程,可以对比mapreduce的yarn运行)
1.大纲 spark应用构成:Driver(资源申请.job调度) + Executors(Task具体执行) Yarn上应用运行构成:ApplicationMaster(资源申请.job调度) + ...
- linux下php命令无法使用如何解决
本文主要和大家分享linux下php命令无法使用如何解决,测试是否添加php环境变量方法: 如下:输入php -v 显示 php 命令没有找到 [root@iz8vbhc4d7zoazstpw7gw8 ...
- 附004.Docker Compose环境变量说明
一 环境变量概述 Compose支持在docker-compose执行命令的文件夹中,名为.env的环境变量配置文件声明默认环境变量. 二 定义变量 2.1 语法规则 Compose建议env文件中的 ...
- PHP给图片加水印
<?php /** *图片加水印 *@param $srcImg 原图 *@param $waterImg 水印图片 *@param $savepath 保存路径 *@param $savena ...
- ApplicationListener<ContextRefreshedEvent>接口,Spring启动后获取所有拥有特定注解的Bean
最近项目中遇到一个业务场景,就是在Spring容器启动后获取所有的Bean中实现了一个特定接口的对象,第一个想到的是ApplicationContextAware,在setApplicationCon ...
- 移动端html页面分享
开发APP应用比开发移动端网页挑战小,因为APP应用只需要适配不同手机即可,而移动端网页不仅需要适配不同手机,还要适配同一部手机的不同浏览器. 移动端页面分享是一个常用的功能,需要宿主环境,可以是某A ...
- python在使用MySQLdb模块时报Can't extract file(s) to egg cacheThe following error occurred while trying to extract file(s) to the Python eggcache的错误。
这个是因为python使用MySQLdb模块与mysql数据库交互时需要一个地方作为cache放置暂存的数据,但是调用python解释器的用户(常常是服务器如apache的www用户)对于cache所 ...
- [ZJOI2010]网络扩容
OJ题号: BZOJ1834.洛谷2604 思路: 对于第一问,直接跑一遍最大流即可. 对于第二问,将每条边分成两种情况,即将每条边拆成两个: 不需扩容,即残量大于零时,相当于这条边费用为$0$: 需 ...
- BeautifulSoup库的使用方法
from bs4 import BeautifulSoup import lxml html = ''' <html><head><title>The Dormou ...