mysql 8.0 ~ innodb与变量优化
一 innodb的优化
1 已完全不支持myisam引擎
2 将自增主键的计数器持久化到redo log中。每次计数器发生改变,都会将其写入到redo log中。如果数据库发生重启,InnoDB会根据redo log中的计数器信息来初始化其内存值。为了尽量减小对系统性能的影响,计数器写入到redo log中,并不会马上刷新。解决了主键分配不正常的情况
3 针对select for update操作等待处理
select for update nowait/skip locked 不会再进行锁等待直到超时,会立刻退出
二 变量
1 已完全不支持query_cache_size查询缓存
2 新添加死锁检测热开关,可以手动进行死锁关闭,提高并发量 变量名称 innodb_deadlock_detect
3 不再支持压缩的临时表。当 innodb_strict_mode启用(默认值),在指定压缩格式时会发生错误,在其他应用临时表的情况下都要应用ibtmp1数据文件
4 innodb_flush_method 默认不再为null,在类unix环境下为fsync
5 SET PERSIST variables= '' 可以直接生效,但是并不是直接应用到配置文件中,而是生成一个 mysqld-auto.cnf的配置文件,记载详细的记录 mysqld-auto.cnf文件中的配置相比my.cnf文件具有高优先级,如果相同配置出现在两个文件中,就以mysqld-auto.cnf文件中的记录为主。
6 支持会话级别SET_VAR 动态调整部分参数,有利于提升语句性能
select /*+ SET_VAR(sort_buffer_size = 16M) */ name from people order y name;
7 增加两个变量用于undo redo加密,默认关闭
innodb_undo_log_encrypt
innodb_undo_log_encrypt
8 添加首个自适应参数 innodb_dedicated_server
1 默认关闭
2 只读值,必须在重启后生效
3 优先级低于配置文件中的选项
4 测试相关环境(内存64G,centos6.5 ext4文件系统,在小内存和不同文件系统可能不同,这点请注意)
决定三个值 innodb_buffer_pool_size, innodb_log_file_size 和 innodb_flush_method(O_DIRECT_NO_FSYNC)
探测到的物理内存 * 0.75(很合理,如果只有mysql单实例)
flush_method为 O_DIRECT_NO_FSYNC
innodb_log_file_size(2g)
5 mysqld服务进程每次重启后都会自动调整上述三个参数值,并不会持久保存在配置文件中,非常智能
6 不适应单机多实例和引擎复杂的场景
7 InnoDB使用O_DIRECT来刷新IO,但是跳过fsync()步骤。对某些文件系统有效,但是对XFS文件系统并不适用。为了保证文件的metadata刷新到磁盘中,XFS必须使用O_DIRECT。
9 双1 设置
innodb_flush_log_at_trx_commit 和sync_log 默认都是双1,最安全高效
三 ddl 优化
1 要么成功要么回滚,将DDL操作回滚日志写入到data dictionary 数据字典表 mysql.innodb_ddl_log,实现了DDL的原子性
eg drop table t1,t2;在8.0中 如果t2不存在,那么t1被删除后也会回滚,这在以前的版本是不能实现的
四 innodb 并发redo日志的实现
MTR (Mini TRansaction)
特别说明
mysql 8.0之前
1 InnoDB存储引擎严格的保证MTR写入Redo Log Buffer的顺序是按照LSN递增的顺序,以及flush list中的脏页按LSN递增顺序排序。
2 MTR是串行的完成从本地日志Copy redo到全局Redo Log Buffer以及添加Dirty Page到Flush list的
多线程并发情况控制顺序写入redo_log_buffer和 LRU_FLUSH_LIST
这一约束是通过两个全局锁log_sys_t::mutex和log_sys_t::flush_order_mutex实现的。
mysql 8.0之后的改进
一 并发机制的改进
1 去掉了 两个全局锁log_sys_t::mutex和log_sys_t::flush_order_mutex,实现了并发MTR的写入
2 在redo_log_buffer通过预留位置(全局的原子变量log_t::s)保证LSN全局向前推进,通过(新的数据结构Link_buf)解决并发拷贝速度导致的空洞问题
二 线程独立的增加
log_writer 负责将redo_log_buffer缓存写到os cache中
log_flusher 执行fysnc函数将os cache数据刷到磁盘文件中
用户线程只需要在事务提交的时候,根据innodb_flush_log_at_trx_commit定义的不同行为,等待log_writer或log_flusher的通知即可
在8.0之前,是由用户线程触发fsync或者等先提交的线程执行fsync( Group Commit行为), 而在MySQL 8.0中,用户线程只需要等待flushed_to_disk_lsn足够大即可。
三 总结
我们可以发现,innodb在并发写入log_buffer_cache和事务提交触发动作两方面进行了很大程度的优化,这样能提高很高的并发能力
mysql 8.0 ~ innodb与变量优化的更多相关文章
- MySQL 8.0 InnoDB新特性
MySQL 8.0 InnoDB新特性 1.数据字典全部采用InnoDB引擎存储,支持DDL原子性.crash safe,metadata管理更完善 2.快速在线加新列(腾讯互娱DBA团队贡献) 3. ...
- MySQL 并行复制演进及 MySQL 8.0 中基于 WriteSet 的优化
MySQL 8.0 可以说是MySQL发展历史上里程碑式的一个版本,包括了多个重大更新,目前 Generally Available 版本已经已经发布,正式版本即将发布,在此将介绍8.0版本中引入的一 ...
- Mysql优化系列(1)--Innodb重要参数优化
1.简单介绍InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎.InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读.这些特色 ...
- MySQL与MariaDB核心特性比较详细版v1.0(覆盖mysql 8.0/mariadb 10.3,包括优化、功能及维护)
注:本文严禁任何形式的转载,原文使用word编写,为了大家阅读方便,提供pdf版下载. MySQL与MariaDB主要特性比较详细版v1.0(不含HA).pdf 链接:https://pan.baid ...
- mysql 5.7 innodb count count(*) count(1) 大数据 查询慢 耗时多 优化
原文:mysql 5.7 innodb count count(*) count(1) 大数据 查询慢 耗时多 优化 问题描述 mysql 5.7 innodb 引擎 使用以下几种方法进行统计效率差不 ...
- MySQL的Innodb缓存相关优化
MySQL的Innodb缓存相关优化 INNODB 状态的部分解释 通过 命令 SHOW STATUS LIKE 'Innodb_buffer_pool_%' 查看 Innodb缓存使用率 (I ...
- mysql 8.0 主从复制的优化
mysql 8.0复制改进一简介: 基于GTID下的并行复制,本文不考虑MGR架构二 主要特性 1 基于writeset的下的改进型并行复制 我在之前的一篇文章关于并行复制中详细的介绍了关 ...
- MySQL 8.0安装 + 配置环境变量 + 连接 cmd
MySQL 安装教程 搜索 MySQL,进入官网,找到 download 点击适用于 window community 版本,点击图中第二个 450.7 M 的安装包进行下载 这里有五个选项,选择第二 ...
- MySQL · 引擎特性 · InnoDB 事务子系统介绍
http://mysql.taobao.org/monthly/2015/12/01/ 前言 在前面几期关于 InnoDB Redo 和 Undo 实现的铺垫后,本节我们从上层的角度来阐述 InnoD ...
随机推荐
- linux提取第一列且删除第一行(awk函数)
如下文件所示,只想提取红框中的内容,即进行提取第一列,且去除第一行的操作 则用到下列命令行: awk 'NR == 1 {next} {print $1}' file.txt > file_co ...
- struts2 OGNL配和通用标签和其它标签的使用
三.OGNL配合通用标签的其他使用 1.iterator标签(很重要) 动作类 package com.itheima.web.action; import java.util.ArrayList; ...
- javascript学习一、js的初步了解
1.javascript的简介: *javascript 是一种基于对象和事件驱动的语言,主要应用于客户端. -- 基于对象: ** 提供了很多对象,可以直接使用. --事件驱动: ** html做 ...
- vmstat命令详解
一:简介 vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存.进程.CPU活动进行监控.他是对系统的整体情况进行统计,不足之处是无法对某个 ...
- python字节(bytes)
在 3.x 中,字符串和二进制数据完全区分开.文本总是 Unicode,由 str 类型表示,二进制数据则由 bytes 类型表示.Python 3 不会以任意隐式的方式混用 str 和 bytes, ...
- Excel:11个查询函数组合
还不懂?上栗子~ 1.普通查找 根据表二中的姓名,查找表一对应的应发工资.最基础的VLOOKUP函数就能搞定. 2.反向查找 根据表二姓名,查找表一编号.但表一中编号列在姓名列之前,无法直接使用VLO ...
- python: 基本知识(二)
1.set() set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集.差集.并集等. x = set('hello’) y = set('world') x ---- ...
- KMP算法的next[]数组通俗解释
原文:https://blog.csdn.net/yearn520/article/details/6729426 我们在一个母字符串中查找一个子字符串有很多方法.KMP是一种最常见的改进算法,它可以 ...
- canvas.drawImage()方法详解
首先看html5.js /**@param {Element} img_elem@param {Number} dx_or_sx@param {Number} dy_or_sy@param {Numb ...
- 2016vijos 1-1 兔子的字符串(后缀数组 + 二分 + 哈希)
题意: 给出一个字符串,至多将其划分为n部分,每一部分取出字典序最大的子串ci,最小化 最大的ci 先看一个简化版的问题: 给一个串s,再给一个s的子串t,问能否通过将串划分为k个部分,使t成为划分后 ...