MySQL
文章平均质量分 91
通过各种渠道获取MySQL的知识体系,汇总并分享给大家一起学习
薛定谔的码
这个作者很懒,什么都没留下…
展开
-
MySQL - 浅谈分库分表
1、分库分表简介1.1、使用背景当表的数量达到了几百乃至上千张时,若众多的业务模块都访问该数据库,则会对该数据库造成较大的压力,此时需要考虑对其进行分库。当表的数据达到了数千万级别时,则对该表进行对许多操作性能都会损耗严重,此时需要考虑对其进行分库或分表。1.2、数据切分分类数据的切分(Sharding)根据其切分规则的类型,可以分为两种切分模式:垂直切分:按照业务模块进行切分,将不同模块的表切分到不同的数据库中。水平切分:将一张大表按照一定的切分规则,按照行切分成不同的表或者切分到不原创 2020-08-26 16:40:23 · 243 阅读 · 0 评论 -
MySQL性能优化1 - 服务器层面优化
1、服务器硬件优化提升硬件设备,例如选择尽量高频率的内存(频率不能高于主板的支持)、提升网络带宽、使用SSD高速磁盘、提升CPU性能等。对于CPU的选择:对于数据库并发比较高的场景,CPU的数量比频率重要。对于CPU密集型场景和频繁执行复杂SQL的场景,CPU的频率越高越好。2、CentOS系统针对MySQL的参数优化2.1、内核相关参数可以通过在文件 sysctl.conf 中添加参数实现优化。该文件默认目录为:/etc/sysctl.conf。以下参数可以直接放到该文件的末尾。增原创 2020-08-18 23:21:30 · 334 阅读 · 1 评论 -
MySQL性能分析与优化 - Profile分析
1、Profile介绍Query Profiler是MySQL自带的一种query诊断分析工具,通过它可以分析出一条SQL语句的硬件性能瓶颈在什么地方(如CPU、IO等),以及该SQL执行所耗费的时间等。不过该工具只有在MySQL 5.0.37以及以上版本中才有实现。默认的情况下,MySQL的该功能没有打开,需要自己手动启动。2、开启Profile2.1、查看开启状态Profile 功能由MySQL会话变量 profiling 控制,默认是关闭的(OFF)。首先查看是否开启了Profile功能原创 2020-08-16 22:29:21 · 182 阅读 · 0 评论 -
MySQL性能分析与优化 - 慢查询日志
1、设置慢查询日志1.1、配置参数说明在MySQL配置文件(my.cnf)中,慢查询日志包含四个重要参数:slow_query_log:是否开启慢查询日志,默认OFF,开启则设置为 ON。slow_query_log_file:慢查询日志文件存储位置。log_queries_not_using_indexes:是否把没有使用到索引的SQL记录到日志中,默认OFF,开启则设置为ON。long_query_time:超过多少秒的查询才会记录到日志中。1.2、配置参数设置全局设置方式原创 2020-08-16 20:49:16 · 274 阅读 · 0 评论 -
MySQL锁原理分析 - 死锁案例分析
本文通过案例分析【两个Session的两条SQL产生死锁情况】与【两个Session的一条SQL产生死锁情况】来展示死锁的形成过程,并综合两个案例对形成过程作出总结,通过提供解决与避免死锁的方式方法。原创 2020-08-15 02:02:17 · 223 阅读 · 1 评论 -
MySQL行锁 - 行锁原理实例分析
1、简单SQL的加锁分析1.1、数据准备1.2、RC隔离级别下DML条件1.2.1、主键1.2.2、非主键唯一索引1.2.3、非唯一索引1.2.4、无索引1.3、RR隔离级别下DML条件1.3.1、主键1.3.2、非主键唯一索引1.3.3、非唯一索引1.3.4、无索引原创 2020-08-13 00:09:02 · 777 阅读 · 0 评论 -
MySQL事务 - MVCC
1、当前读和快照读快照读:读取的是记录的可见版本 (有可能是历史版本),不用加锁。简单纯粹的查询操作,属于快照读。 SELECT * FROM student WHERE id=1;当前读:读取的是记录的最新版本,并且当前读返回的记录,都会加上锁,保证其他事务不会再并发修改这条记录。特殊的读操作、插入、更新、删除操作,属于当前读。SELECT * FROM student WHERE id=1 LOCK IN SHARE MODE; //共享锁(S)SELECT * FROM student原创 2020-08-06 00:44:39 · 301 阅读 · 0 评论 -
MySQL事务 - ReadView
在隔离级别中提到:对于使用READ UNCOMMITTED隔离级别的事务来说,直接读取记录的最新版本就好了。对于使用SERIALIZABLE隔离级别的事务来说,使用加锁的方式来访问记录。对于使用READ COMMITTED和REPEATABLE READ隔离级别的事务来说,就需要用到版本链。核心问题就是:需要判断一下版本链中的哪个版本是当前事务可见的。所以设计InnoDB的设计者提出了一个ReadView的概念,这个ReadView中主要包含当前系统中还有哪些活跃的读写事务,把它们的事务id放到原创 2020-08-05 00:35:11 · 1695 阅读 · 3 评论 -
MySQL版本链 - Undo Log
1、前序准备# 测试表CREATE TABLE student ( id int PRIMARY KEY, name VARCHAR(100)) Engine=InnoDB CHARSET=utf8;# 测试数据INSERT INTO student VALUES (1, '张三');2、Undo Log分类2.1、insert undo loginsert undo log是在insert操作中产生的undo log。因为insert操作的记录只对事务本身可见,对于其它事务,此原创 2020-08-03 00:50:12 · 1248 阅读 · 2 评论 -
MySQL事务 - 隔离性中的隔离级别
1、前提概念隔离性(isolation)事务的隔离性意味着并发的事务之间是相互隔离的。即一个事务的内部操作及正在操作的数据必须封锁起来,不被企图进行修改的其他事务看到。隔离性是DBMS针对并发事务间的冲突提供的安全保证,DBMS可以通过加锁的方式在并发执行的事务间提供不同级别的分离。假如并发交叉执行的事务没有任何控制,操纵相同的共享对象的多个并发事务的执行可能引起异常情况。DBMS可以在并发执行的事务间提供不同级别的分离。分离的级别和并发事务的吞吐量之间存在反比关系。较多事务的可分离性可能会带来较原创 2020-08-02 22:28:41 · 347 阅读 · 3 评论 -
MySQL事务 - 事务的基本概念与重要特性
1、事务概述在MySQL中,事务是由存储引擎实现的,支持事务的存储引擎不多,比较典型的就是InnoDB存储引擎。2、事务的四大特性数据库事务具有ACID四大特性:原子性(atomicity)事务的原子性意味着事务中包含的程序作为数据库的逻辑工作单位,被视作一个“原子”。在这个“原子”内,对数据的改操作要么全部执行(事务提交),要么全部不执行(事务回滚)。如果把一个事务看作是一个程序,它要么完整的被执行,要么完全不执行。对于数据库层面而言,事务的操纵序列要么完全应用到数据库,要么完全不影响数原创 2020-08-02 17:12:48 · 435 阅读 · 0 评论 -
MySQL日志序列号 - LSN
概要LSN(log sequence number):日志序列号,是一个一直递增的整形数字,在MySQL5.6.3版本后占8个字节。它表示事务写入到日志的字节总量。LSN主要用于发生crash时对数据进行recovery!每个数据页、重做日志、checkpoint都有LSN。LSN不仅存在于重做日志中,在每个数据页头部也会有对应的LSN号。在数据页头部,LSN记录当前页最后一次修改的LSN号,用于在recovery时对比重做日志LSN号决定是否对该页进行恢复数据。checkpoint也是有LSN号记录转载 2020-08-01 22:59:43 · 2276 阅读 · 0 评论 -
MySQL重做日志缓冲 - Redo log Buffer
1、前提概念:Mini-TransactionInnoDB有两个非常重要的日志:undo log、redo log(1)通过undo log可以看到数据较早版本,实现MVCC,或回滚事务等功能。(2)通过redo log用来保证事务持久性。Mini-Transaction是用来实现InnoDB的物理逻辑日志的写入和页恢复的。通过Mini-Transaction来保证并发事务操作和数据库异常时页的一致性。换言之,Mini-Transaction主要用于innodb redo log和undo log写原创 2020-08-01 16:55:52 · 1887 阅读 · 2 评论 -
MySQL双写 - Double Write
如果说change buffer给InnoDB存储引擎带来了性能上的提升,那么Double Write带给InnoDB存储引擎的是数据页的可靠性。本文通过图文的方式,着重讲解Double Write可靠性原理。同时,可以通过点击change buffer链接,查看为什么change buffer会给InnoDB存储引擎带来性能上的提升。原创 2020-07-31 23:37:26 · 5025 阅读 · 0 评论 -
MySQL检查点机制 - CheckPoint
对于 InnoDB 存储引擎而言,是通过 LSN(Log Sequence Number)来标记版本的。Checkpoint 发生的时间、条件及脏页的选择等都非常复杂。而 Checkpoint 所做的事情无外乎是将缓冲池中的脏页刷回到磁盘,不同之处在于每次刷新多少页到磁盘,每次从哪里取脏页,以及什么时间触发Checkpoint。原创 2020-07-31 00:59:56 · 1678 阅读 · 0 评论 -
MySQL存储引擎之InnoDB - 写缓冲(change buffer)
1、前序1在《MySQL存储引擎之InnoDB - 缓冲池(buffer pool)》中提到:(1)MySQL数据存储包含内存与磁盘两个部分;(2)内存缓冲池(buffer pool)以页为单位,缓存最热的数据页(data page)与索引页(index page);(3)InnoDB以变种LRU算法管理缓冲池,并能够解决“预读失效”与“缓冲池污染”的问题;毫无疑问,对于读请求,缓冲池能够减少磁盘IO,提升性能。问题来了,那写请求呢?2、场景1:访问页命中缓冲池假如要修改页号为4的索引转载 2020-07-29 00:37:02 · 779 阅读 · 2 评论 -
MySQL存储引擎之InnoDB - 缓冲池(buffer pool)
1、前言操作系统,会有缓冲池(buffer pool)机制,避免每次访问磁盘,以加速数据的访问。应用系统分层架构,为了加速数据访问,会把最常访问的数据,放在缓存(cache)里,避免每次都去访问数据库。MySQL作为一个存储系统,同样具有缓冲池(buffer pool)机制,以避免每次查询数据都进行磁盘IO。2、初识缓冲池InnoDB的缓冲池的缓存内容与作用缓存表数据与索引数据,把磁盘上的数据加载到缓冲池,避免每次访问都进行磁盘IO,起到加速访问的作用。(速度快,那为啥不把所有数据转载 2020-07-28 01:14:51 · 787 阅读 · 0 评论 -
MySQL的锁机制 - 间隙锁
间隙锁是封锁索引记录中的间隔,或是第一条索引记录之前的范围,又或是最后一条索引记录之后的范围。1、间隙锁打开设置首先查看 innodb_locks_unsafe_for_binlog 是否禁用SHOW variables LIKE 'innodb_locks_unsafe_for_binlog';-- 结果:+--------------------------------+-------+| Variable_name | Value |+-------.转载 2020-07-26 02:00:33 · 1836 阅读 · 2 评论 -
MySQL学习笔记3 - 锁的分类
1、锁介绍-- 范例表create table mylock( id int not null primary key auto_increment, name varchar(20));insert into mylock(id, name) values (1, 'a');insert into mylock(id, name) values (2, 'b');insert into mylock(id, name) values (3, 'c');insert into myloc原创 2020-07-19 23:32:45 · 318 阅读 · 0 评论 -
MySQL学习笔记 - 浅谈索引
1、索引简介1.1、索引的利弊利检索:可以提高数据检索的效率,降低数据库的IO成本,类似于书的目录。排序:通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗。索引下推:server层不能处理的索引,可以通过索引下推(ICP)在存储引擎层处理。索引覆盖:在满足覆盖索引条件时,可以避免回表查询。…弊索引会占据磁盘空间。索引虽然会提高查询效率,但是会降低更新表的效率。比如每次对表进行增删改操作,MySQL不仅要保存数据,还有保存或者更新对应的索引文件。1.2、索引的分类原创 2020-07-19 02:27:55 · 298 阅读 · 0 评论 -
MySQL学习笔记1 - MySQL架构
MySQL架构可以分为物理架构与逻辑架构1、逻辑架构逻辑架构图式如下1.1、连接器(Connectors)MySQL连接器为客户端程序提供与MySQL服务器的连接。 连接器使您能够连接和执行来自另一种语言或环境的MySQL语句,包括ODBC,Java(JDBC),Perl,Python,PHP,Ruby等MySQL实例。以JAVA为例,mysql-connector-java是MySQL的JDBC驱动包,通过该jar包实现JDBC连接MySQL。Oracle收购MySQL后,为MySQL.原创 2020-07-18 02:38:52 · 197 阅读 · 0 评论 -
MySQL之OPTIMIZE TABLE应用简介
MySQL删除表数据(DELETE)时,MySQL并不会回收这条记录占据的存储空间以及索引位,而是空在那里,等待新的数据来弥补这个空洞。若一时半会没有数据来填补这个空洞,就会形成资源浪费。OPTIMIZE TABLE操作会整理数据文件的碎片,释放多余的空间。所以对于写操作比较频繁的表,需要根据实际情况定期进行optimize。原创 2020-06-27 03:02:23 · 1511 阅读 · 0 评论