InnoDB

MySQL事务原理浅析

十年热恋 提交于 2020-11-24 02:58:07
前言 ​ 因为自己对数据的可靠性,可用性方面特别感兴趣,所以在MySQL事务方面看了很多资料,也看了很多博客,所以想到自己也写一篇博客整理整理自己所学内容,尽量用自己的语言解释得通俗易懂。 事务经典场景 ​ 在很多介绍事务的博客都会代入这样一个场景,先简单说说: ​ A给B转账100,A少100,B多100。如果A少100后系统崩溃怎么办?B的钱多不了,这样金钱总数凭空少了100。这里就需要用到事务了。 什么是事务? ​ 事务是恢复和并发控制的基本单位,事务有四个特性(ACID),原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability)。本文主要围绕这四个特性展开介绍。 原子性 ​ 原子性就是不可拆分的特性,要么全部成功然后提交(commit),要么全部失败然后回滚(rollback)。若开启事务,在上述场景就不会出现 A少100 成功,B多100 失败 这种情况。MySQL通过Redo Log重做日志实现了原子性,在将执行SQL语句时,会先写入redo log buffer,再执行SQL语句,若SQL语句执行出错就会根据redo log buffer中的记录来执行回滚操作,由此拥有原子性。 一致性 ​ 一致性指事务将数据库从一种状态转变为下一种一致的状态。比如有一个字段name有唯一索引约束

应用示例荟萃 | 全方位认识 information_schema

久未见 提交于 2020-11-23 20:37:39
在上一篇 《InnoDB 层压缩相关字典表 | 全方位认识information_schema》 中,我们详细介绍了InnoDB层记录压缩表信息的字典表,本期我们将为大家带来系列第九篇《应用示例荟萃 | 全方位认识information_schema》,也是"全方位认识information_schema"的最后一篇,下面请跟随我们一起开始information_schema系统库的系统学习之旅吧 PS:为了方便大家更直观地理解下文中的示例信息,我们在这一期里特地把示例中涉及到的相关字段含义重新罗列了出来,所以本文会稍微长一些。 1. 使用Server层的字典表查询相关的元数据信息 1.1. 查看数据库中是否有使用外键 KEY_COLUMN_USAGE表提供查询哪些索引列存在约束条件(该表记录的约束信息除了外键之外,还包括主键和唯一索引约束的信息),假设我们想查询一下employees库下是否存在外键,我们可以使用如下SQL进行查询 root@localhost : information_schema 04:29:04> select * from information_schema.KEY_COLUMN_USAGE where CONSTRAINT_SCHEMA='employees' and REFERENCED_TABLE_SCHEMA is not null\G ***

MySQL 5.7 vs 8.0,哪个性能更牛?

旧街凉风 提交于 2020-11-23 06:13:40
点击上方蓝色“ 程序猿DD ”,选择“设为星标” 回复“ 资源 ”获取独家整理的学习资料! 来源: r6d.cn/8cw 背景 测试mysql5.7和mysql8.0分别在读写,选定,只写模式下不同并发时的性能(tps,qps) 最早 测试使用版本为mysql5.7.22和mysql8.0.15 sysbench测试前先重启mysql服务,并清除os的缓存(避免多次测试时命中缓存) 每次进行测试都是新生成测试数据后再进行mysql5.7和mysql8.0的测试 每次测试时保证mysql5.7和mysql8.0的配置参数一致 环境 机器 cat / etc / redhat-release | xargs echo'版本'&& dmidecode -s系统产品名称| xargs echo'是否虚拟化'&& cat / proc / cpuinfo | grep“ processor” | wc -l | xargs echo'cpu核数'版本CentOS Linux版本7.5.1804(核心)是否虚拟化KVM cpu核数4 myql5.7.22 5.7.22 -log innodb_buffer_pool_size 128 M innodb_log_buffer_size 64 M innodb_log_file_size 48 M binlog_format ROW log_bin

重要,知识点:InnoDB的插入缓冲

▼魔方 西西 提交于 2020-11-22 21:01:24
InnoDB引擎有几个重点特性,为其带来了更好的性能和可靠性: 插入缓冲(Insert Buffer) 两次写(Double Write) 自适应哈希索引(Adaptive Hash Index) 异步IO(Async IO) 刷新邻接页(Flush Neighbor Page) 今天我们的主题就是 插入缓冲(Insert Buffer) ,由于InnoDB引擎底层数据存储结构式B+树,而对于索引我们又有聚集索引和非聚集索引。 在进行数据插入时必然会引起索引的变化,聚集索引不必说,一般都是递增有序的。而非聚集索引就不一定是什么数据了,其离散性导致了在插入时结构的不断变化,从而导致插入性能降低。 所以为了解决非聚集索引插入性能的问题,InnoDB引擎 创造了Insert Buffer。 Insert Buffer 的存储 看到上图,可能大家会认为Insert Buffer 就是InnoDB 缓冲池的一个组成部分。 重点 :其实对也不对,InnoDB 缓冲池确实包含了Insert Buffer的信息,但Insert Buffer 其实和数据页一样,也是物理存在的(以B+树的形式存在共享表空间中)。 Insert Buffer 的作用 先说几个点: 一张表只能有一个主键索引,那是因为其物理存储是一个B+树。(别忘了聚集索引叶子节点存储的数据,而数据只有一份)

MySql 缓冲池(buffer pool) 和 写缓存(change buffer) 转

☆樱花仙子☆ 提交于 2020-11-22 05:27:57
 应用系统分层架构,为了加速数据访问,会把最常访问的数据,放在 缓存 (cache)里,避免每次都去访问数据库。  操作系统,会有 缓冲池 (buffer pool)机制,避免每次访问磁盘,以加速数据的访问。  MySQL作为一个存储系统,同样具有 缓冲池 (buffer pool)机制,以避免每次查询数据都进行磁盘IO。  今天,和大家聊一聊InnoDB的缓冲池。 InnoDB的缓冲池缓存什么?有什么用?   缓存表数据与索引数据 ,把磁盘上的数据加载到缓冲池,避免每次访问都进行磁盘IO,起到加速访问的作用。 速度快,那 为啥不把所有数据都放到缓冲池里 ?  凡事都具备两面性,抛开数据易失性不说,访问快速的反面是 存储容量小 :   (1)缓存访问快,但容量小,数据库存储了200G数据,缓存容量可能只有64G;   (2)内存访问快,但容量小,买一台笔记本磁盘有2T,内存可能只有16G;  因此, 只能把“最热”的数据放到“最近”的地方 ,以“最大限度”的降低磁盘访问。 如何管理与淘汰缓冲池,使得性能最大化呢? 在介绍具体细节之前,先介绍下“ 预读 ”的概念。 什么是预读?   磁盘读写,并不是按需读取,而是按页读取, 一次至少读一页数据 (一般是4K),如果未来要读取的数据就在页中,就能够省去后续的磁盘IO,提高效率。 预读为什么有效?   数据访问,通常都遵循“集中读写

MySQL 8.0.22正式发布

不问归期 提交于 2020-11-21 06:34:33
MySQL的最新版本8.0.22于2020年10月19日正式发行。这一版本里面有哪些变化,让我们快速浏览一下。 审计日志的改进 :对于JSON格式的日志文件,MySQL企业审计支持使用audit_log_read()用户定义函数进行日志读取操作。之前,只有通过向audit_log_read()传递一个参数才能指定开始读取的位置,为了更加灵活现在可以命名一个以时间戳的开始说明符,以便从该时间戳或之后的第一个事件开始读取。 MySQL企业版现在包含一个 keyring_oci插件 ,它使用Oracle Cloud Infrastructure Vault作为密钥环存储的后端。密钥信息不会永久存储在MySQL服务器本地存储中。 优化器部分 : prepared语句现在只在执行PREPARE时准备一次,而不是在每次执行时准备一次。此外,存储过程里面的语句也仅在初次执行时准备一次。 filesort算法现在支持对多个表上的联接进行排序,而不仅仅是对单个表进行排序。 在MySQL 8.0.22中,服务器在内部将所有右连接实例处理为左连接,消除了一些在解析时没有执行完整转换的特殊情况。 增加了支持SELECT INTO DUMPFILE 和 SELECT INTO OUTFILE 在写入文件时定期同步。 MySQL现在为符合条件的查询实现派生条件下推,将外部where条件推入派生表。 SQL语法

停一停先别划走!吊打全网的MySQL进阶面试突击,吃透最少阿里P7

感情迁移 提交于 2020-11-20 18:53:21
网上有不少关于 MySQL 调优的文章,之前也发过一些。但不少朋友反映依旧对 MySQL 底层原理及架构这些内容一知半解,没有吃透,总是会遇到不少问题: 如何提高查询语句性能?如何突破单库性能瓶颈?如何做到数据库的高并发与高可用? 需要获取得话麻烦一键三连之后看下图小助理的微信:(vip1024x)添加即可免费获取到哦 为了解答 MySQL 体系架构、InnoDB 执行流程、索引优化 等问题,这里给大家推荐的这份【 MySQL进阶面试突击 】,特别适合对 MySQL索引调优、事务和锁优化等进阶内容掌握不系统的朋友。 就 MySQL 系统架构、执行流程、索引原理、性能分析、事务和锁原理等做出深入浅出的解读,进而帮你搭建起 MySQL 的底层知识框架,夯实常用技能点。无论是日常开发工作,还是求职面试,都非常值得学习。看完之后,你可以学到: 系统梳理 MySQL 体系架构和执行流程 可以从全局思考如何解决业务问题,而不是局限于某个方面 提高代码质量和调优能力 助力面试中表现出色,取得更高水平的薪资 对照知识体系,查漏补缺 数据库理论模块 OLTP与OLAP OLTP(关系型数据库) OLAP(数据分析挖掘) 数据库完整性 实体完整性 参照完整性 关系查询处理和查询优化 关系数据库系统的查询处理 关系数据库系统的查询优化 代数优化 物理优化 事务与数据库恢复技术 事务的基本概念

面了美团我才知道大公司的面试有多恐怖,附上我的美团5面经历,终拿offer!

微笑、不失礼 提交于 2020-11-19 13:26:49
前言 面了美团,越发让我觉得想进大厂还需要很长时间的积累,问的知识点并没有那么多那么宽,但是会比我看到的更深入一点更贴近使用场景一点,自己差的还很远,可能真的要以春招为目标了 1.自我介绍 2.简单说一下项目,项目的问题,难点 3.Mybatis的$和#的区别 4.Mysql的存储引擎有哪些 5.Myisam和Inodb的区别 6.Innodb一定要有主键嘛,原因是什么 7.主键为什么建议使用自增主键,比如是字符串可以做主键嘛 8.Innodb的锁有哪些 9.解释一下间隙锁 10.间隙锁是共享锁还是排它锁 11.共享锁和排它锁对比 12.什么情况触发表锁和行锁和间隙锁(间隙锁没答对被追问了) 13.最左匹配原则,abc,顺序也是abc,什么情况索引肯定会失效,什么情况下整个索引都失效 14.spring mvc的执行流程 15.lock的底层实现原理(忘记了,很尴尬,很急但就是想不起来了) 16.jdk的线程池有哪些,怎么选择使用哪个线程池(只记得概念,怎么选择完全说不出来) 17.核心线程数和最大线程数的数量该设计为多大 18.设计模式了解哪些,工厂模式什么情况会用到 19.哪个框架在什么地方会用到这些模式 20.有用过redis,esmq嘛(后面告诉我我的知识范围宽度广度都需要提高,这些技术还需要去学习 😭😭) 21.jvm什么情况下触发young gc和full gc

mysql备份与还原-mysqldump备份、mysql与source还原

笑着哭i 提交于 2020-11-19 05:41:27
以下都以在linux操作系统上的mysql为例 mysqldump备份 mysqldump实际就是将数据库中的数据转化为建库、建表和插入记录的sql语句 1.备份一个数据库 [或其中几个表],不指定表表示备份整个数据库,指定表表示备份指定的表 在系统命令下: mysqldump -u用户 -p密码 库 [表1 表2 表3 …] > /opt/backname.sql [root@oldboy opt]# mysqldump -uroot -poldboy oldboy student >/opt/studentbak.sql 备份一个库或其中的表时,备份语句中不包含建库语句,因此还原时需要指定数据库 如果备份整个库时加上-B参数,备份语句中会包含建库和切库语句如mysqldump -uroot -poldboy -B oldboy,-B参数不适用于备份表 2.备份多个数据库 在系统命令下: mysqldump -u用户 -p密码 --databases 库1 库2 库3 … > /opt/backname.sql mysqldump -u用户 -p密码 --B 库1 库2 库3 … > /opt/backname.sql [root@oldboy opt]# mysqldump -uroot -poldboy --databases oldboy oldboy_utf8 >/opt

mysql的备份与还原,安装(window)

余生颓废 提交于 2020-11-19 05:19:23
之前一直使用的navicat的自动的备份功能。但是在使用navicat的还原功能时,贼慢。 今天要做的是window服务器上将mysql单个数据库备份。然后还原到我的mac笔记本上。 本来以为很快的,中间遇到来一些小坑,搞了很久。 1. 备份 ,从window服务器使用mysqldump命令来备份,由于后面还要下载到本地,所以备份同时要进行压缩,不然数据量很大,呆会下载要很久。 D:\tool\mysql\bin\mysqldump.exe -uusername -ppassword dbname --default-character- set =UTF8| gzip >d:\ backup \dbname_% date :~0,4%% date :~5,2%% date :~8,2%.gz 上面的gzip命令,需要自己先在服务器安装上gzip的window版本。然后在环境变量中添加bin目录到path路径下。 最后 > 后面是备份到的目录和文件名,文件名根据日期自动命名。这里最好指定导出时的字符集,不然中文会出现乱码情况。 2. 还原 下载到本地,解压缩还原。 mysql -h192.168.0.101 -uusername -p"password" --default-character- set =utf8 -f dbname < dbname_20190601.gz