InnoDB

第14期:数据页合并

血红的双手。 提交于 2020-10-14 19:11:18
MySQL InnoDB 表数据页或者二级索引页(简称数据页或者索引页)的合并与分裂对 InnoDB 表整体性能影响很大;数据页的这类操作越多,对 InnoDB 表数据写入的影响越大。 MySQL 提供了一个 数据页合并临界值 (MERGE_THRESHOLD),在某些场景下,可以人为介入,减少数据页的合并与分裂。 在 InnoDB 表里,每个数据页默认16K 大小,默认 MERGE_THRESHOLD 值为 50,取值范围从 1 到 50,默认值即是最大值。也就是当页面记录数占比小于 50% 时,MySQL 会把这页和相邻的页面进行合并,保证数据页的紧凑,避免太多浪费。 触发临界值场景 场景一: 页 A 里本来数据占用 100%,有一部分记录被删掉后,数据占用小于 50%,刚好触发了临界值。 场景二: 页 B 里存放的记录被更新为更短的形式,比如记录值由 rpad('我爱你们所有人' , 10000, '添加冗余字符')变为 '我只爱你' ,这时候记录对数据页占用也小于 50%,刚好触发了临界值。 简述数据页的合并 页 A 在删除一些记录后,此页里剩余记录对页 A 的占用小于 MERGE_THRESHOLD 设定的值,此时刚好页 A 相邻的一个页 C,数据占用也不到 50%,这时候 MySQL 会把页 C 的记录并入页 A,之后页 C 的空间就被释放,不包含任何数据,页 C

MySQL Clone Plugin(克隆插件,适用8.0.17+)

爷,独闯天下 提交于 2020-10-14 13:54:19
MySQL Clone Plugin(克隆插件,8.0.17+) 一. 克隆插件是什么? 允许从本地或远程MySQL服务器实例拷贝数据 可对InnoDB的schemas,tables,tablespaces,数据字典元数据进行物理快照 支持replication,如用于MGR 二. 使用克隆插件 2.1 安装克隆插件 # 方式一:配置文件加载插件 [mysqld] plugin-load-add=mysql_clone.so # 方式二:使用install plugin语句,会在mysql.plugins表中注册 install plugin clone SONAME 'mysql_clone.so'; 如果安装报错 ERROR 1123 (HY000): Can't initialize function 'clone'; Plugin initialization function failed. ,检查 explicit_defaults_for_timestamp 是否开启(1):参考 Bug #96281 2.2 克隆本地数据 将本地MySQL数据目录克隆到另一个目录,用户需要 BACKUP_ADMIN 权限 # 创建用户和授权 create user 'clone_backup'@'localhost' identified by 'xxx'; grant backup

MySQL 死锁产生原因和解决方法

情到浓时终转凉″ 提交于 2020-10-14 12:53:39
点击上方 一个优秀的废人 , 选择 设为星标 优质文章,及时送达 blog.csdn.net/tr1912/article/details/81668423 Mysql 锁类型 一、锁类型介绍: MySQL 有三种锁的级别:页级、表级、行级。 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般 算法: next KeyLocks 锁,同时锁住记录 (数据),并且锁住记录前面的 Gap Gap 锁,不锁记录,仅仅记录前面的 Gap Recordlock 锁(锁数据,不锁 Gap) 所以其实 Next-KeyLocks=Gap 锁 + Recordlock 锁 二、死锁产生原因和示例 1、产生原因: 所谓死锁 :是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。表级锁不会产生死锁。所以解决死锁主要还是针对于最常用的 InnoDB。 死锁的关键在于:两个 (或以上) 的 Session 加锁的顺序不一致。 那么对应的解决死锁问题的关键就是

MyISAM 和 InnoDB 索引结构及其实现原理

て烟熏妆下的殇ゞ 提交于 2020-10-14 05:57:23
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。 索引的实现通常使用B_TREE。 B_TREE索引加速了数据访问,因为存储引擎不会再去扫描整张表得到需要的数据; 相反,它从根节点开始,根节点保存了子节点的指针,存储引擎会根据指针快速寻找数据。 MyISAM引擎 使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址. 即:MyISAM索引文件和数据文件是分离的,MyISAM的索引文件仅仅保存数据记录的地址。 MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引, 如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。 MyISAM的索引方式也叫做“非聚集”的。 物理文件结构为: .frm文件:与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等。 .myd(mysql data)文件:myisam存储引擎专用,用于存储myisam表的数据 .myi(mysql index)文件:myisam存储引擎专用,用于存储myisam表的索引相关信息 InnoDB引擎 也使用B+Tree作为索引结构,但是InnoDB的数据文件本身就是索引文件,叶节点data域保存了完整的数据记录。 这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。这种索引叫做

MVCC

混江龙づ霸主 提交于 2020-10-14 00:03:40
MVCC,多版本并发控制协议,是数据库中经常使用的的一种并发控制手段,是MySQL中基于乐观锁理论实现隔离级别的方式,用于实现读已提交和可重复读取隔离级别的实现 MVCC最大的好处是:读不加锁,读写不冲突。在读多写少的OLTP应用中,读写不冲突是非常重要的,极大的提高了系统的并发性 Mysql在可重复读隔离级别下如何保证事务较高的隔离性,同样的sql查询语句在一个事务里多次执行查询结果相同,就算其它事务对数据有修改也不会影响当前事务sql语句的查询结果。 这个隔离性就是靠MVCC(Multi-Version Concurrency Control)机制来保证的,对一行数据的读和写两个操作默认是不会通过加锁互斥来保证隔离性,避免了频繁加锁互斥,而在串行化隔离级别为了保证较高的隔离性是通过将所有操作加锁互斥来实现的。 Mysql在读已提交和可重复读隔离级别下都实现了MVCC机制。 MVCC就一句话总结:同一份数据临时保存多个版本的一种方式,进而实现并发 快照读和当前读 在MVCC并发控制中,读操作可以分成两类:快照读 (snapshot read)与当前读 (current read),快照读,读取的是记录的可见版本 (有可能是历史版本),不用加锁,当前读,读取的是记录的最新版本,并且当前读返回的记录,都会加上锁,保证其他事务不会再并发修改这条记录 快照读: 简单的select操作

论mysql 的修复

怎甘沉沦 提交于 2020-10-13 08:10:35
mysql本身的校验机制很强,所以他的ibdata,iblog之间如果匹配不上,会出大问题: 比如强制断电会引起; 比如数据库在更新时,你拷了整个数据库,准备另作他用,结果发现,数据会起不来。 (1) 在强制断电引起的启动不来的问题,我们通常会修改数据库的innodb_force_recovery 方式,先导出数据,然后重建数据库,再导入数据 ,在数据量不大的情况 下,这种都没有问题;而遇到海量的数据时,你的导出导入,理论上是可行的,但实际上会要命。 (2) 所以我们升级了Mysql,让数据库更加强健; 增加了主备,不可能同时坏掉吧? 在A ,B主备情况下,通常,如果坏了一个,只需要拷贝一个数据文件到另一个,修改下uuid,再建立主备就没有问题了。切记在dB关掉的情况下,不然又会出现 ibdata log不一致而无法起来的情况 。 这种一锅端的修复方式 最为省心,只是数据量比较大的情况,比如5000万数据,50G左右的话,拷贝时间就够呛! 当然也要注意 chown -R mysql:mysql data3307 这样的更改组的概念,不然你用root账号去操作,后面mysql权限不够也启动不来。 (3)当然,你还可以新建立数据库后, 通过drop tablesspace ;import table的方式导入原来的海量数据,这样仿佛还比较快呢,

学习笔记

十年热恋 提交于 2020-10-13 06:18:13
1、有朋友给我留言 为什么他的库表里面,有些是连续的,有些不是连续的,而且他的表都是自增(`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键id'),他的潜意识里这个id应该是连续的才对。因此准备梳理梳理mysql自增主键的值的变化情况,让朋友有个比较全面的了解。 2、自增值存储说明 2.1 MyISAM 引擎的自增值保存在数据文件中。 2.2 InnoDB 引擎的自增值,其实是保存在了内存里,并且到了 MySQL 8.0 版本后,才有了“自增值持久化”的能力,也就是才实现了“如果发生重启,表的自增值可以恢复为 MySQL 重启前的值”,具体情况是: a)在 MySQL 5.7 及之前的版本,自增值保存在内存里。每次重启后,第一次打开表的时候,都会去找自增值的最大值 max(id),然后将 max(id) + 1 作为这个表当前的自增值。 b)在 MySQL 8.0 版本,将自增值的变更记录在了 redo log 中,重启的时候依靠 redo log 恢复重启之前的值。 3、自增值修改机制 在 MySQL 里面,如果字段 id 被定义为 AUTO_INCREMENT,在插入一行数据的时候,自增值的行为如下: 如果插入数据时 id 字段指定为 0、null 或未指定值,那么就把这个表当前的 AUTO_INCREMENT

2020 Java 面试题 小结 (答案慢慢补上,有错误请指出)

北城以北 提交于 2020-10-12 03:44:22
线程池的参数 创建线程的方式 如何暂停线程,有几种方式 线程之间的通讯 线程中什么是原子性、什么是可见性、什么是有序性? Volatile是如何实现可见性的? AQS中共享锁有哪些?独占锁有哪些 synchronized 关键字有几种用法? synchronized 的缺点有哪些? 静态方法和非静态方法锁的对象分别是什么? 对象锁和类锁有什么区别? 什么是哨兵机制? jvm中堆是否存储了所有对象 哪些没有存入里面 堆中的有哪些区域,1.8和之前有什么区别 元空间和永久代有什么区别 创建一个对象一定会存入新生区吗? 哪些情况不会存入新生代, jvm的工作流程 luinx中文件的权限管理 ArrayList和链表的区别 hashmap和hashtable有什么区别 java中异常分为哪几种类? Error 、Runtime Exception 、Exception 分别是什么?他们之间的关系是什么? 你遇到过哪些异常? tcp的三次握手,为什么要三次,俩次不行吗? tcp三次握手中传递的参数有哪些? tcp和udp的区别? 数据库索引为什么查询快? 数据库索引有哪些数据结构? 主键索引和二级索引的区别? 回表是什么? 使用非主键索引查询会不会出现回表? MySQL中你知道有哪些存储引擎? InnoDB跟Myisam的区别? 什么是事务? 事务的四大特性? 哪些存储引擎支持事务?

再见,MySQL!

淺唱寂寞╮ 提交于 2020-10-11 15:26:53
MySQL 作为互联网中非常热门的数据库,在高并发业务场景下,一条好的 MySQL 语句能为企业节省大量的运作时间和成本,这也是为何互联网大厂面试官最爱考察数据库底层和性能调优的原因。因此, 了解其底层原理和架构的设计非常重要 ,尤其是MySQL的存储引擎,很大程度上决定了 MySQL 整体的执行效率和工作性能。 网上有不少关于 MySQL 调优的文章,之前也发过一些。但不少朋友反映依旧对 MySQL 底层原理及架构这些内容一知半解,没有吃透,总是会遇到不少问题: 如何提高查询语句性能?如何突破单库性能瓶颈?如何做到数据库的高并发与高可用? 为了解答 MySQL 体系架构、InnoDB 执行流程、索引优化 等问题,这里给大家推荐一位架构师前辈的直播分享,特别适合对 MySQL索引调优、事务和锁优化等进阶内容掌握不系统的朋友。 主题: 完美解答 35K 月薪的 MySQL 面试题 形式: 视频分享 价格: 199 元 ( 0 元,仅限前 100 名 ) 分享人: 灭霸詹 内容预告: 1. InnoDB 存储引擎的内存结构 2.MySQL查询的执行流程 3.磁盘数据如何加载到InnoDB内存( 脏页落盘机制 ) 4. RC 和 RR 隔离级别下,如何加锁及使用 MVCC 机制读取数据 5. undolog 和 ReadView 如何实现事务隔离性 6. redolog

【转】Mysql 多表连接查询的执行细节 (一)

独自空忆成欢 提交于 2020-10-10 18:19:07
原文来自 https://blog.csdn.net/qq_27529917/article/details/87904179 先构建本篇博客的案列演示表: create table a ( a1 int primary key , a2 int , index ( a2 ) ) ; --双字段都有索引 create table c ( c1 int primary key , c2 int , index ( c2 ) , c3 int ) ; --双字段都有索引 create table b ( b1 int primary key , b2 int ) ; --有主键索引 create table d ( d1 int , d2 int ) ; --没有索引 insert into a values ( 1 , 1 ) , ( 2 , 2 ) , ( 3 , 3 ) , ( 4 , 4 ) , ( 5 , 5 ) , ( 6 , 6 ) , ( 7 , 7 ) , ( 8 , 8 ) , ( 9 , 9 ) , ( 10 , 10 ) ; insert into b values ( 1 , 1 ) , ( 2 , 2 ) , ( 3 , 3 ) , ( 4 , 4 ) , ( 5 , 5 ) , ( 6 , 6 ) , ( 7 , 7 ) , ( 8 , 8 ) , ( 9