
MySQL高级
文章平均质量分 85
Android_la
Java入门到进阶级别
展开
-
面试必备——MySQL解决幻读的底层实现原理
本篇的理论知识偏多会略显枯燥,但这也是解决电商项目高并发的关键理论知识笔者旨在将MVCC以及锁这些知识串通起来,使得更加系统,同时也理顺自己混乱的思绪。建议先阅读笔者写的InnoDB锁和事务模型之锁MySQL锁之InnoDB锁实战面试必备——MySQL的MVCC实现原理,简单阅读了解个大概即可由于写写并发操作的场景下会涉及间隙锁,因此在这里简要介绍间隙锁,下文也会提到它。InnoDB支持3种行锁如下,详情可以见InnoDB锁和事务模型之锁行锁(Record Lock):锁是直接加在索引。原创 2023-02-06 23:23:03 · 436 阅读 · 0 评论 -
面试必备——MySQL的MVCC实现原理
文章目录1 问题背景2 前言3 什么是MVCC4 必备知识4.1 行记录的三个隐藏字段1 问题背景生产环境上的电商项目中,常常遇到MySQL等待锁超时的报错,实际场景常见于批量更新店铺的税费(针对地区批量更新)、批量更新商品系列的内容等等。因此来研究MySQL的MVCC知识。参考自MySQL官方文档——InnoDB Multi-VersioningMySQL专有名词文档——MySQL Glossary2 前言本篇博客注重讲述实现原理,很多处地方可能晦涩难懂,读一次半次理解不了是原创 2022-03-27 17:41:38 · 3178 阅读 · 4 评论 -
MySQL的Read View简介
文章目录1 问题背景2 前言3 什么是Read View1 问题背景最近在研究MySQL的MVCC知识,常看到有提到一个Read View关键字。2 前言本文有部分知识点会比较晦涩难懂,如果对MVCC还没了解的伙伴,推荐配合阅读【MySQL笔记】正确的理解MySQL的MVCC及实现原理,再配合MySQL官方文档,综合反复阅读,才能品味其中的意义。3 什么是Read View官方文档原文介绍:Read View原文:read viewAn internal snapshot.原创 2022-03-17 13:43:09 · 3190 阅读 · 0 评论 -
面试必备——MySQL的ACID实现原理
文章目录1 问题背景2 事务3 原子性4 持久性4.1 redo log的存在背景4.2 为什么将redo log的数据写到磁盘比将Buffer中的数据写到磁盘快?4.3 redo log什么时候同步到磁盘里去?1 问题背景前面用sql语句演示了MySQL锁导致的现象,从现象去认知了MySQL锁到底是怎么样的。在本博客MySQL高级系列的文章中也有研究过InnoDB引擎的架构。今天来串联一下InnoDB引擎的架构以及MySQL事务、MySQL锁的知识。参考自:MySQL事务ACID实现原理2原创 2022-01-31 15:15:52 · 3307 阅读 · 2 评论 -
MySQL锁之InnoDB锁实战
文章目录1 问题背景2 前言3 回顾4 资源准备5 行锁5.1 产生行锁时的可重复读5.2 更新同一行记录时的锁竞争6 表锁7 间隙锁1 问题背景前面研究了很多锁的概念性知识,并没有很客观形象地了解发生InnoDB锁时到底会有什么现象。今天使用sql实战操作一下,看看InnoDB锁会造成什么现象。参考自:InnoDB锁和事务模型之锁MySQL行锁、表锁、间隙锁2 前言针对前面若干篇InnoDB官方文档所学的知识以及相关视频,笔者总结下关于InnoDB锁的知识。本篇博客仅供自己总.原创 2021-12-20 23:09:54 · 780 阅读 · 4 评论 -
InnoDB锁和事务模型之锁
文章目录1 问题背景2 前言3 InnoDB锁有哪些4 共享锁、排他锁1 问题背景前面基本从整体上了解了InnoDB的架构以及若干个常听到的概念,比如undo log、redo log。今天研究常讲到的锁,比如共享锁、排他锁、意向锁、间隙锁等等。2 前言本片博客仅从概念级别切入,后续再深入研究3 InnoDB锁有哪些共享锁(Shared Locks)、排他锁(Exclusive Locks)意向锁(Intention Locks)记录锁(Record Locks)间隙锁(Gap原创 2021-12-09 22:25:59 · 504 阅读 · 0 评论 -
InnoDB磁盘架构之undo log
文章目录1 问题背景2 回顾3 undo log1 问题背景前面了解了InnoDB磁盘架构之redo log,今天了解undo log2 回顾InnoDB架构如下所示:3 undo log原文原创 2021-12-07 17:28:04 · 190 阅读 · 0 评论 -
InnoDB磁盘架构之redo log
文章目录1 问题背景1 问题背景前面研究了InnoDB磁盘架构之双写缓冲区,今天来研究原创 2021-12-01 16:31:43 · 1077 阅读 · 0 评论 -
InnoDB磁盘架构之双写缓冲区
文章目录1 问题背景2 回顾3 双写缓冲区1 问题背景前面研究了InnoDB磁盘架构之表空间,今天来研究双写缓冲区。2 回顾InnoDB架构如下图所示:3 双写缓冲区原文The doublewrite buffer is a storage area where InnoDB writes pages flushed from the buffer pool before writing the pages to their proper positions in the Inn.原创 2021-11-24 22:46:27 · 1261 阅读 · 0 评论 -
InnoDB磁盘结构之表空间
文章目录1 问题背景2 回顾3 表空间3.1 系统表空间3.2 File-Per-Table 表空间3.2.1 File-Per-Table 表空间配置3.2.2 File-Per-Table 表空间数据文件3.2.3 File-Per-Table 表空间优点3.2.4 File-Per-Table 表空间缺点1 问题背景前面研究了InnoDB磁盘架构之索引,今天研究下表空间2 回顾InnoDB架构如下图所示:3 表空间官方文档对表空间的介绍非常详情,此处只挑选平常接触得多或者比较.原创 2021-11-23 23:21:40 · 608 阅读 · 0 评论 -
InnoDB磁盘架构之索引
文章目录1 问题背景2 回顾3 索引3.1 聚集索引和二级索引1 问题背景前面简单了解了InnoDB磁盘架构之表, 今天研究索引。2 回顾InnoDB架构如下所示:3 索引3.1 聚集索引和二级索引详情见Clustered and Secondary Indexes原文Each InnoDB table has a special index called the clustered index that stores row data. Typically, the c.原创 2021-11-22 23:41:25 · 531 阅读 · 0 评论 -
InnoDB磁盘架构之表
文章目录1 问题背景2 回顾3 表3.1 创建InnoDB表3.2 外部创建表3.3 导入InnoDB表3.4 移动或者复制InnoDB表3.5 将MyISAM表转成InnoDB表3.6 InnoDB如何处理自增1 问题背景前面研究了InnoDB内存架构之日志缓冲区,至此,已经将InnoDB的内存架构全部了解了一遍。今天来研究InnoDB磁盘架构之表2 回顾InnoDB的架构如下图所示:3 表3.1 创建InnoDB表只是简单的讲述了基础的CRUD的东西,笔者不在此处赘述,详情见.原创 2021-11-22 23:18:54 · 361 阅读 · 0 评论 -
InnoDB内存架构之日志缓冲区
文章目录1 问题背景2 回顾3 日志缓冲区1 问题背景前面研究了InnoDB内存架构之自适应Hash索引,今天研究下日志缓冲区。2 回顾InnoDB内存架构如下图所示:3 日志缓冲区原文The log buffer is the memory area that holds data to be written to the log files on disk. Log buffer size is defined by the innodb_log_buffer_size va.原创 2021-11-22 22:50:05 · 1815 阅读 · 0 评论 -
InnoDB内存架构之自适应Hash索引
文章目录1 问题背景2 回顾3 自适应Hash索引1 问题背景前面研究了InnoDB内存架构之更改缓冲区,今天了解下InnoDB内存架构之自适应Hash索引。参考自:MySQL官方文档之InnoDB的自适应Hash索引2 回顾InnoDB的架构如下图所示:3 自适应Hash索引原文The adaptive hash index enables InnoDB to perform more like an in-memory database on systems with .原创 2021-11-21 21:15:25 · 811 阅读 · 0 评论 -
InnoDB内存架构之更改缓冲区
文章目录1 问题背景2 前言3 回顾4 更改缓冲区5 更改缓冲区的配置1 问题背景前面研究了InnoDB内存架构之Buffer Pool缓冲池,今天来研究更改缓冲区。参考自:MySQL官方文档的InnoDB之更改缓冲区2 前言在本篇博客中,“更改缓冲区” 在绝大部分的情况下是一个名词,其由英文Change Buffer翻译过来。更改 在绝大部分情况下也是一个名词。3 回顾InnoDB的架构如下图所示:4 更改缓冲区原文The change buffer is a s.原创 2021-11-21 14:36:16 · 1045 阅读 · 0 评论 -
InnoDB内存架构之Buffer Pool缓冲池
文章目录1 问题背景2 回顾3 InnoDB内存架构4 Buffer Pool 缓冲池1 问题背景前面研究了InnoDB存储引擎的架构,InnoDB包含了内存架构以及磁盘架构,本篇研究内存架构。参考自:MySQL官方文档之InnoDB内存架构2 回顾InnoDB的架构如下图所示:3 InnoDB内存架构如上面的InnoDB架构图所知, InnoDB的内存架构 由 Buffer Pool(缓冲池)、Change Buffer(更改缓冲区)、Adaptive Hash Index(原创 2021-11-16 21:59:07 · 758 阅读 · 0 评论 -
InnoDB存储引擎的架构
文章目录1 问题背景2 架构1 问题背景前面研究了InnoDB的多版本特性,其中出现了若干个罕见的词汇,比如撤销日志(undo log),回滚段,撤销表空间等等。今天来了解InnoDB的架构从而了解前面那些罕见词汇到底是处于InnoDB的什么地方,处于什么地位担任什么角色。参考自:MySQL官方文档之InnoDB的架构2 架构如下图所示,InnoDB的架构在内存以及磁盘方面都有架构:后面将从内存架构、磁盘架构详细研究各个组件...原创 2021-11-14 14:15:01 · 442 阅读 · 0 评论 -
InnoDB的多版本特性
文章目录1 问题背景2 前言3 概述4 隐藏字段1 问题背景前面研究了MySQL事务以及隔离级别官方解释以及MySQL事务隔离级别实战演示,今天研究MySQL的InnoDB引擎的多版本(Multi-versioning)特性。参考自:MySQL官方文档的InnoDB Multi-Versioning2 前言本文章仅从官方文档进行理论学习。适合对MySQL多版本特性方面是零基础的伙伴阅读。文章涉及较多英文,本意是提供最原始的文档供考证,如果看不懂英文可直接看中文。3 概述官方原文:原创 2021-11-11 19:58:33 · 687 阅读 · 0 评论 -
MySQL事务隔离级别实战演示
文章目录1 问题背景2 前言3 实战环境4 必备知识5 读未提交实战6 读已提交实战7 可重复读实战8 串行化实战1 问题背景前面了解了MySQL官方解释的MySQL事务,详情看MySQL事务以及隔离级别官方解释。今天写写sql实战了解隔离级别会发生什么现象2 前言网上一大堆都只是停留在文字描述(读已提交会产生xxx,可重复读可避免xxx),本篇博客旨在使用sql实战解释清楚四个隔离级别到底是怎么样的。本文仅使用update、select做实战操作。(delete操作应该会有更复杂的现象。笔.原创 2021-11-02 16:25:07 · 249 阅读 · 0 评论 -
临时性设置MySQL隔离级别
文章目录1 问题背景2 知识1 问题背景用sql玩隔离级别时需要临时性设置MySQL的隔离级别。因此了解设置隔离级别的相关sql语句。参考自MySQL设置数据库隔离级别2 知识查看MySQL隔离级别:# 查看全局隔离级别select @@global.transaction_isolation;# 查看会话隔离级别select @@session.transaction_isolation;设置全局隔离级别:set global transaction isolati原创 2021-11-02 14:58:55 · 441 阅读 · 0 评论 -
MySQL事务以及隔离级别官方解释
文章目录1 问题背景2 ACID是什么?1 问题背景最近写的MySQL业务逻辑常常遇到com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exc异常报错,(这业务逻辑是先查询、再update、再逻辑删除,期间sql的条件语句用到了xxx in ()),于是去学习MySQL事务相关的东西。研究过程中不可避免的是常常遇到数据库设计原则ACID。因此笔者去MySQL官方文档看了下关于ACID原文介原创 2021-11-02 12:22:26 · 196 阅读 · 0 评论 -
基于Linux搭建MySQL8.0 Cluster集群
文章目录一. 问题背景二. 准备资源2.1 三台虚拟机2.2 MySQL8.0以及MySQLShell三. 准备环境3.1 修改Linux系统配置3.2 关闭Linux的防火墙3.3 卸载CentOS自带的Mariadb数据库四. MySQL Cluster部署说明五. 具体部署操作一. 问题背景前面搭建CentOS集群并配置NAT网络模式,今天基于Linux搭建MySQL8.0 Cluster集群。参考自:烹饪MySQL8.0 Cluster这道菜注意,搭建MySQL集群前必须已经把搭建Ce原创 2020-10-30 18:01:17 · 2483 阅读 · 3 评论 -
Linux上启动MySQL8.0报错
一.问题背景在CentOS上搭建MySQL集群,安装MySQL后启动MySQL报错。二. 解决方案首先很大可能是my.cnf配置文件有问题其次是data目录结构没有权限访问,这个很坑,非常难发现。解决方法是切换到root用户,执行chown -R 用户名:组名 *,这样就可以将当前文件夹及其子文件夹里面所有的文件的权限修改了。...原创 2020-10-26 16:27:25 · 994 阅读 · 0 评论 -
CentOS下的MySQL8.0的my.cnf配置文件
文章目录一. 问题背景二. my.cnf一. 问题背景CentOS搭建MySQL8.0集群,搭建详情可查看烹饪MySQL8.0 Cluster这道菜。这里记录mysql的配置文件my.cnf二. my.cnf配置中的ip地址都是集群中的ip地址,可根据自己情况修改ip地址。使用了3台虚拟机搭建集群,其中一台做router以及写入,另外两台做读取数据[mysqld] character-set-server=utf8port=3306 socket=/tmp/mysql.sockbase原创 2020-10-26 11:59:17 · 4196 阅读 · 1 评论 -
Day14——MySQL索引底层分析
文章目录一. 回顾二. B+Tree的定义2.1 学术理论上的B+Tree2.2 InnoDB使用的B+Tree三. 引出问题四. InnoDB中的“页”4.1 页的概念4.2 InnoDB中页的结构五. 主键索引的生成过程5.1 插入数据的过程5.2 少数据量的查询过程5.3 大数据量的查询过程5.3.1 问题背景5.3.2 解决方案5.4 怎么存储更多的数据5.4.1 问题背景5.4.2 解决方案5.4.3 两页的数据情况5.4.4 多页长链表5.4.4.1 问题背景5.4.4.2 解决方案5.5 主键原创 2020-08-16 00:51:20 · 324 阅读 · 0 评论 -
Day13——视图
文章目录一. 回顾二. 视图一. 回顾前面学习了Day12——慢查询日志,今天学习视图二. 视图总结:视图的作用就是封装解耦练习:注意代码中的注释#视图是将一段查询sql封装为y一个虚拟的表#虚拟表只保存了sql逻辑,bu不会保存ren任何查询结果#视图的作用:#1.封装复杂的sql,提高复用性。比如做报表,将各种字段封装成视图(存在mysql里面),在Java中查询视图即可#2.逻辑放在数据库里面,更新不需要发布程序,面对频繁的需求变更更加灵活#总结:作用就是封装解耦#适用原创 2020-08-14 20:54:31 · 140 阅读 · 0 评论 -
Day12——慢查询日志
文章目录一. 回顾二. 慢查询日志2.1 什么是慢查询日志2.2 练习一. 回顾前面学习了Day11——8个sql优化讲解,今天学习慢查询日志二. 慢查询日志2.1 什么是慢查询日志2.2 练习注意代码中的注释,如下:#慢查询日志默认不打开show VARIABLES like '%slow_query_log%';set global slow_query_log = 1;#开启慢查询日志,使用global表明在其他窗口也有效show VARIABLES like '%long原创 2020-08-14 20:36:33 · 173 阅读 · 0 评论 -
Day11——8个sql优化讲解
文章目录一. 回顾二. 8个sql优化讲解一. 回顾前面学习了Day10——排序分组优化,今天学习8个sql优化讲解二. 8个sql优化讲解注意代码中的注释,如下:#1、列出自己的掌门比自己年龄小的人员#自己写的SELECT c.* from t_emp c left join (SELECT age, deptId from t_emp a inner join t_dept bon a.id = b.ceo) abon c.deptId = ab.deptIdwhere ab.原创 2020-08-14 16:38:37 · 224 阅读 · 4 评论 -
Day10——排序分组优化
文章目录一. 回顾二. 排序分组优化一. 回顾前面学习了Day9——子查询优化,今天来学习排序分组优化二. 排序分组优化注意代码中的注释,如下:#清除索引call proc_drop_index("mydb", "emp");call proc_drop_index("mydb", "dept");-----------------------------------------------------------------------------#创建索引create index原创 2020-08-14 14:42:42 · 220 阅读 · 2 评论 -
Day9——子查询优化
文章目录一. 回顾二. 子查询优化三. 总结一. 回顾前面学习了Day8——关联查询优化,今天来学习子查询优化二. 子查询优化注意代码中的注释,如下:#至少有2位非掌门人成员的门派#写法1SELECT * from t_emp a where a.id not in(SELECT ceo from t_dept b where b.CEO is not null);#写法2SELECT * from t_emp a left join t_dept bon a.id = b.ceo原创 2020-08-14 10:07:09 · 137 阅读 · 0 评论 -
Day8——关联查询优化
文章目录一. 回顾二. 关联查询优化一. 回顾前面学习了Day7——单表优化,今天来学习关联查询优化二. 关联查询优化注意代码中的注释,如下:#建表create table if not exists class( id int(10) unsigned not null auto_increment, card int(10) unsigned not null, PRIMARY KEY (id));create TABLE if not exists book(原创 2020-08-14 09:35:42 · 164 阅读 · 0 评论 -
Day7——单表优化
文章目录一. 回顾二. 单表优化练习三. 总结四. 一般性建议一. 回顾前面搭建好了Day6——准备sql优化的环境——批量插入数据,今天开始学习单表优化二. 单表优化练习注意代码中的注释,如下:explain SELECT SQL_NO_CACHE * from emp where emp.age = 30;#建立索引create index idx_age on emp(age);#清掉索引call proc_drop_index("mydb", "emp");---------原创 2020-08-13 21:18:29 · 145 阅读 · 0 评论 -
Day6——准备sql优化的环境——批量插入数据
文章目录一. 回顾二. 准备环境一. 回顾前面学习了Day5——explain,今天来准备sql优化的环境,批量插入数据,1w条部门数据,50w条员工数据。二. 准备环境这里直接给出sql脚本的代码,按照注释以及代码顺序去运行即可。#创建表create table dept( id int(11) not null auto_increment, deptName varchar(30) DEFAULT null, address VARCHAR(40) DEFAULT null原创 2020-08-13 15:33:20 · 141 阅读 · 0 评论 -
Day5——explain
文章目录一. 回顾二. explain2.1 是什么2.2 能干嘛2.3 怎么玩2.4 各字段解释2.4.1 id2.4.2 select_type2.4.3 table2.4.4 type2.4.5 possiable_keys2.4.6 key2.4.7 key_len2.4.8 ref2.4.9 rows2.4.10 Extra一. 回顾前面学习了Day4——索引分类,今天学习explain二. explain2.1 是什么使用explain可以模拟优化器执行sql查询语句,从而知道MySQ原创 2020-08-12 21:20:03 · 163 阅读 · 1 评论 -
Day4——索引分类
文章目录一. 回顾二. 索引分类三. 查看、创建、删除索引四. 哪些情况需要创建索引五. 哪些情况不要创建索引一. 回顾前面学习了Day3——索引结构,今天学习索引分类二. 索引分类主键索引唯一索引复合索引普通索引(即单值索引)全文索引三. 查看、创建、删除索引查看索引:show index from 表名;创建、删除索引详细语法如下:#基本语法#创建索引create [UNIQUE] index 索引名 on 表名(字段名);#删除索引drop index 索引名 o原创 2020-08-12 11:24:30 · 126 阅读 · 0 评论 -
Day3——索引结构
文章目录一. 回顾二. 索引简介2.1 什么是索引2.2 优势2.3 劣势三. BTree索引四. B+Tree索引五. MySQL索引结构六. 聚簇索引与非聚簇索引一. 回顾前面学习了Day2——存储引擎、sql预热,今天来学习一下索引结构。二. 索引简介2.1 什么是索引官方定义:索引(Index)是帮助MySQL高效获取数据的数据结构索引的本质是数据结构。一般来说索引本身也是非常大的,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上2.2 优势提高数据检索的效率,降低原创 2020-08-12 09:58:09 · 317 阅读 · 0 评论 -
Day2——存储引擎、sql预热
文章目录一. 回顾二. 存储引擎2.1 概述2.2 MyISAM以及InnoDB一. 回顾前面学习了Day1——权限、sql_mode、逻辑架构,后面学习存储引擎、sql预热。二. 存储引擎2.1 概述使用show engines;可以查看mysql中有哪些引擎,如下:使用show variables like '%storage_engine';查看MySQL的默认引擎,如下:总结:MySQL中比较常用的引擎是MyISAM以及InnoDB。后面对他们的关键点进行介绍。2.2 MyISA原创 2020-08-11 16:24:37 · 224 阅读 · 0 评论 -
Day1——权限、sql_mode、逻辑架构
文章目录一. 问题背景二. 权限2.1 创建用户2.2 授权命令三. sql_mode3.1 问题背景3.2 为什么上面的查询语句不正确仍能执行呢?3.3 设置sql_mode四. 数据库的逻辑结构4.1 总体概览4.2 查看sql的执行周期4.2.1 查看最近几次的sql执行周期4.2.2 查看详细的执行周期五. 命中缓存的条件六. 查询顺序6.1 手写语句的顺序6.2 机器读的顺序一. 问题背景Linux:CentOSMySQL:5.5.54情况:学习尚硅谷教程的MySQL高级,讲师是夏磊二.原创 2020-08-10 22:41:11 · 274 阅读 · 0 评论