
MySQL
文章平均质量分 86
基于最新的MySQL 8.0版本对其从架构,存储引擎,事务管理,索引实现原理,各种锁机制原理全方位,多角度进行刨析,以解决实战生产问题为目的,对Mysql性能,优化,分库分表,故障处理进行讲解。
不要迷恋发哥
永远不要“用战术上的勤奋,掩饰战略上的懒惰”~~~~~~一名爱好古筝的IT宅男
展开
-
【高并发高性能高可用之海量数据MySQL实战】-提纲目录-不断更新中...
1:引言你是否遇到以下问题?1:查询优化中不要select *,要用in,不能用or,为什么?2:数据量大之后分库分表,那拆分规则是什么?怎么处理后续问题?3:数据库挂了怎么处理?万能重启之法,然后听天由命?4:先拆分还是先做集群,主从复制如何处理主库从库数据不一致?你该如何解决的?遇事不决量子力学?东一枪西一炮?2:概述本人在开课吧学习的数据库相关的课程已告一段落。从今天开始将基于最新的MySQL 8.0版本对MySQL从架构,存储...原创 2022-02-05 22:00:00 · 1874 阅读 · 1 评论 -
【高并发高性能高可用之海量数据MySQL实战-28】-MySQL集群搭建之主从复制
1:主从复制原理2:binlog和relay日志bin log:bin log 记录所有数据的更改,可用于本机数据恢复和主从同步。relay(中继) log:Mysql 主节点将binlog写入本地,从节点请求增量binlog,主节点将binlog同步到从节点。从节点单独进程会将binlog 拷贝至本地 relaylog中。从节点定时重放relay log。1:开启binlog修改my.cnf文件在[mysqld]段下添加:#binlog刷盘策略...原创 2022-04-27 22:00:00 · 463 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-31】-MySQL之MyCat配置读写分离
1、Mycat简介1)Mycat是什么?mycat是一个数据库中间件,支持读写分离、分库分表。2)Mycat核心概念MyCAT支持水平分片与垂直分片:水平分片:一个表格的数据分割到多个节点上,按照行分隔。垂直分片:一个数据库中多个表格A,B,C,A存储到节点1上,B存储到节点2上,C存储到节点3 上。MyCAT通过定义表的分片规则来实现分片,每个表格可以捆绑一个分片规则,每个分片规则指定一个分 片字段并绑定一个函数,来实现动态分片算法。1.Schema:...原创 2022-04-30 22:00:00 · 767 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-30】-MySQL基于主从复制的高可用方案
双节点主从 + keepalived/heartbeat方案,一般来说,中小型规模的时候,采用这种架构是最省事的。两个节点可以采用简单的一主一从模式,或者双主模式,并且放置于同一个VLAN中,在master节点发生故障后,利用keepalived/heartbeat的高可用机制实现快速切换到slave节点。在这个方案里,有几个需要注意的地方:把两个节点的auto_increment_increment(自增起始值)和auto_increment_offset(自增步 长)设成不同值。其目的是为了避免原创 2022-04-29 22:00:00 · 744 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-29】-MySQL集群搭建之读写分离
1、读写分离的理解名词解释:HAC:High Availability Cluster,高可用集群注意事项:MySQL的主从复制,只会保证主机对外提供服务,而从机是不对外提供服务的,只是在后台为主机进行备 份。2、读写分离演示需求MySQL master:132MySQL slave :1333、MySQL-Proxymysql-proxy是mysql官方提供的mysql中间件服务,课提供读写分离的功能。MySQLProxy虽然可以实现读写分...原创 2022-04-28 22:00:00 · 525 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-27】-MySQL服务器层面优化
1、缓冲区优化将数据保存在内存中,保证从内存读取数据设置足够大的innodb_buffer_pool_size,将数据读取到内存中。1.InnoDB使用操作在服务器启动时为整个缓冲池分配内存。 innodb_buffer_pool_size系统变量定义缓冲池大小。通常,建议的innodb_buffer_pool_size值为系统内存的 50%到 75%。2.在具有大量内存的系统上,可以通过将缓冲池划分为多个缓冲池实例来提高并发性。innodb_buffer_pool_inst...原创 2022-04-26 22:00:00 · 938 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-26】-MySQL索引及SQL语句优化
1、索引优化1.表记录很少不需创建索引 (索引是要有存储的开销).2.一个表的索引个数不能过多。(1)空间:浪费空间。每个索引都是一个索引树,占据大量的磁盘空间。(2)时间:更新(插入/Delete/Update)变慢。需要更新所有的索引树。太多的索引也会增加优化器的选择时间。所以索引虽然能够提高查询效率,索引并不是越多越好,应该只为需要的列创建索引。3.频繁更新的字段不建议作为索引。频繁更新的字段引发频繁的页分裂和页合并,性能消耗比较高。4.区分度低的字段,...原创 2022-04-25 22:00:00 · 625 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-25】-Query Profiler分析语句
1、介绍Query Profiler是MySQL自带的一种query诊断分析工具,通过它可以分析出一条SQL语句的硬件性能瓶颈在什么地方。通常我们是使用的explain,以及slow query log都无法做到精确分析,但是QueryProfiler却可以定位出一条SQL语句执行的各种资源消耗情况,比如CPU,IO等,以及该SQL执行所耗费的时间等。不过该工具只有在MySQL5.0.37以及以上版本中才有实现。默认的情况下,MYSQL的该功能没有打开,需要自己手动启动。2、开启Profi.原创 2022-04-24 22:00:00 · 202 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-24】-MySQL如何查看执行计划
1、建表语句create table tuser(id int primary key auto_increment,name varchar(100),age int,sex char(1),address varchar(100) );8alter table tuser add index idx_name_age(name(100),age);alter table tuser add index idx_sex(sex(1)); insert into tuser(id原创 2022-04-23 22:00:00 · 530 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-23】-MySQL慢查询日志分析
1、慢查询日志介绍数据库查询快慢是影响项目性能的一大因素,对于数据库,我们除了要优化 SQL,更重要的是得先找到需要优化的SQL。MySQL数据库有一个“慢查询日志”功能,用来记录查询时间超过某个设定值的SQL语句,这将极大程度帮助我们快速定位到症结所在,以便对症下药。至于查询时间的多少才算慢,每个项目、业务都有不同的要求。MySQL的慢查询日志功能默认是关闭的,需要手动开启。2、开启慢查询功能查看是否开启慢查询功能参数说明:- 【slow_query_log】 :..原创 2022-04-22 22:00:00 · 596 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-22】-MySQL死锁原理与分析
本文前面的部分,基本上已经涵盖了MySQL/InnoDB所有的加锁规则。深入理解MySQL如何加锁,有两个比较重要的作用:可以根据MySQL的加锁规则,写出不会发生死锁的SQL;可以根据MySQL的加锁规则,定位出线上产生死锁的原因;1:示例分析下面,来看看两个死锁的例子 (一个是两个Session的两条SQL产生死锁;另一个是两个Session的一条SQL,产生死锁):上面的两个死锁用例。第一个非常好理解,也是最常见的死锁,每个事务执行两条SQL,分别持有了一把锁,然后加另一把原创 2022-04-21 22:00:00 · 439 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-21】-一条复杂SQL的加锁实战分析
delete from t1 where pubtime>1 and pubtime<20 and userid='hdc' and comment is not NULL;如图中的SQL,会加什么锁?假定在Repeatable Read隔离级别下 (Read Committed隔离级别下的加锁情况,留给学生们分析),同时,假设SQL走的是idx_t1_pu索引。在详细分析这条SQL的加锁情况前,还需要有一个知识储备,那就是一个SQL中的where条件如何拆分? 在这里,我直接...原创 2022-04-20 22:00:00 · 410 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-20】-MySQL行锁分析实战
在介绍完一些背景知识之后,接下来将选择几个有代表性的例子,来详细分析MySQL的加锁处理。当然,还是从最简单的例子说起。经常有朋友发给我一个SQL,然后问我,这个SQL加什么锁?就如同下面两条简单的SQL,他们加什么锁?SQL1:select * from t1 where id =10;SQL2:delete from t1 where id =10;针对这个问题,该怎么回答?能想象到的一个答案是:SQL1:不加锁。因为MySQL是使用多版本并发控制的,读不加锁。SQL2...原创 2022-04-19 22:00:00 · 317 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-19】-MySQL锁原理分析实战
1:一条update语句执行过程1CREATE TABLE t (2id INT PRIMARY KEY,3c VARCHAR(100)4) Engine=InnoDB CHARSET=utf8;现在表里的数据就是这样的:然后更新表里的一条数据:update t set c='曹操' where id = 1;执行流程:2:MySQL锁介绍按照锁的粒度来说,MySQL主要包含三种类型(级别)的锁定机制:全局锁:锁的是整个database。由MySQL..原创 2022-04-08 22:00:00 · 780 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-17】-MySQL索引优化失效分析实战
1:案例环境2:案例演示1:全值匹配我最爱2:最佳左前缀法则带头索引不能死,中间索引不能断如果索引了多个列,要遵守最佳左前缀法则。指的是查询从索引的最左前列开始 并且不跳过索引中的列。正确的示例参考上图。错误的示例:带头索引死:3:不要在索引上做计算不要进行这些操作:计算、函数、自动/手动类型转换,不然会导致索引失效而转向全表扫描4:范围条件右边的列失效不能继续使用索引中范围条件(bettween、<、>、in等)右边的列...原创 2022-04-07 22:00:00 · 195 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-16】-MySQL索引创建原则
1、哪些情况需要创建索引1.频繁出现在where条件字段,order排序,groupby分组字段2.select频繁查询的列,考虑是否需要创建联合索引(覆盖索引,不回表)3.多表join关联查询,on字段两边的字段都要创建索引2、索引优化建议1.表记录很少不需创建索引 (索引是要有存储的开销).2.一个表的索引个数不能过多。(1)空间:浪费空间。每个索引都是一个索引树,占据大量的磁盘空间。(2)时间:更新(插入/Delete/Update)变慢。需要...原创 2022-04-06 22:00:00 · 492 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-15】-MySQL索引实现
1、MyISAM索引我们以t_user_myisam为例,来说明。t_user_myisam的id列为主键,age列为普通索引。CREATE TABLE `t_user_myisam`(`id` int(11) NOT NULLAUTO_INCREMENT,`username` varchar(20) DEFAULTNULL,`age` int(11) DEFAULTNULL,PRIMARY KEY (`id`) USINGBTREE,KEY `idx_age` ...原创 2022-04-05 22:00:00 · 4277 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-13】-事务回滚和数据恢复
事务的隔离性由多版本控制机制和锁实现,而原子性,持久性和一致性主要是通过redo log、undo log和Force Log at Commit机制机制来完成的。redo log用于在崩溃时恢复数据,undo log用于对事务的影响进行撤销,也可以用于多版本控制。而Force Log at Commit机制保证事务提交后redo log日志都已经持久化。开启一个事务后,用户可以使用COMMIT来提交,也可以用ROLLBACK来回滚。其中COMMIT或者ROLLBACK执行成功之后,数据一定是会被全部保原创 2022-02-18 23:00:00 · 449 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-12】-MVCC下的读操作
在MVCC并发控制中,读操作可以分成两类:快照读 (snapshot read)与当前读 (current read)。快照读:读取的是记录的可见版本 (有可能是历史版本),不用加锁。当前读:读取的是记录的最新版本,并且当前读返回的记录,都会加上锁,保证其他事务不会再并发修改这条记录。1.快照读快照读也就是一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(MVCC)读取当前数据库中行数据的方式。如果读取的行正在执行DELETE或原创 2022-02-17 23:00:00 · 634 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-11】-基于 MVCC 实现事务的隔离级别
mvcc 只支持 RC 和 RR 两种事务隔离级别。1:READ COMMITTED,读已提交每次读取数据前都生成一个ReadView比方说现在系统里有两个 id 分别为 100 、 200 的事务在执行# Transaction 100BEGIN;UPDATE t SET c = '关羽' WHERE id = 1;UPDATE t SET c = '张飞' WHERE id = 1;# Transaction 200BEGIN;# 更新了一些别的表的记录注:事务执行原创 2022-02-16 23:00:00 · 712 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-10】-InnoDB中MVCC的实现
1:官方网站上对MVCC的解释Acronym for “multiversion concurrency control”. This technique lets InnoDB transactions with certain isolation levels perform consistent read operations; that is, to query rows that are being updated by other transactions, and see the valu原创 2022-02-15 23:54:38 · 789 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-9】-事务并发控制解决方案LBCC与MVCC
1:引言两个事务针对同一数据都发生修改操作时,会存在丢失更新问题。1:转账实例 时间 取款事务A 转账事务B T1 开始事务 T2 开始事务 T3 查询账户余额为1000元 T4 查询账原创 2022-02-14 22:00:00 · 538 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-8】-InnoDB的事务隔离机制
1:事务概述MySQL 是一个服务器/客户端架构的软件,对于同一个服务器来说,可以有若干个客户端与之连接,每个客户端与服务器连接上之后,就可以称之为一个会话( Session )。我们可以同时在不同的会话里输入各种语句,这些语句可以作为事务的一部分进行处理。不同的会话可以同时发送请求,也就是说服务器可能同时在处理多个事务,这样子就会导致不同的事务可能同时访问到相同的记录。我们前边说过事务有一个特性称之为隔离性,理论上在某个事务对某个数据进行访问时,其他事务应该进行排队,当该事务提交之后,其他事务才可以继原创 2022-02-13 23:35:17 · 570 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-7】-内存数据落盘
WAL要求数据的变更写入到磁盘前,首先必须将内存中的日志写入到磁盘;当一个事务提交时,所有产生的日志都必须刷新到磁盘上,如果日志刷新成功后,缓冲池中的数据刷新到磁盘前数据库发生了宕机,那么重启时,数据库可以从日志中恢复数据。这种方法提高了数据写入的效率,同时也形成了内存脏页。脏页最终还是需要写入磁盘的,于是InnoDB采用了 checkpoint机制 实现数据最终的持久性。1.脏页落盘简介 思考一下这个场景:如果重做日志可以无限地增大,同时缓冲池也足够大,那么是不需要将缓冲池中页的新版本刷新回.原创 2022-02-12 22:00:00 · 720 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-6】-MySQL自适应哈希索引
1.概念哈希(hash)是一种非常快的查找方法,在一般情况下这种查找的时间复杂度为O(1),即一般仅需要一次查找就能定位数据。而B+树的查找次数,取决于B+树的高度,在生产环境中,B+树的高度一般为3~4层,故需要3~4次的查询。InnoDB存储引擎会监控对表上各索引页的查询。如果观察到建立哈希索引可以带来速度提升,则建立哈希索引,称之为自适应哈希索引(Adaptive Hash Index,AHI) AHI是通过缓冲池的B+树页构造而来,因此建立的速度很快,而且不需要对整张表构建哈希索引。 InnoD原创 2022-02-11 22:00:00 · 353 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-5】-InnoDB存储引擎之内存结构
1.缓冲池(buffer pool)缓冲池是主内存中的一个区域,用于在访问表和索引数据时对其进行缓存。缓冲池允许直接从内存访问常用数据,从而加快处理速度。在专用服务器上,最多 80% 的物理内存通常分配给缓冲池。 InnoDB 为了提高大容量读取操作的效率,缓冲池被划分为可能包含多行的页。为了提高缓存管理的效率,缓冲池被实现为页面的链接列表;很少使用的数据使用最近最少使用的 (LRU) 算法的变体从缓存中老化。1.缓冲池LRU 算法缓冲池使用 LRU 算法的变体作为列表进行管理。当需要空间.原创 2022-02-10 22:00:00 · 499 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-4】-InnoDB存储引擎之磁盘结构
上图详细显示了InnoDB存储引擎的体系架构,从图中可见,InnoDB存储引擎由内存结构和磁盘结构两大部分组成。InnoDB的主要的磁盘文件主要分为三大块:一是表空间,二是双写缓冲区,三是重做日志,数据字典表空间。1:InnoDB逻辑存储结构InnoDB存储引擎逻辑存储结构可分为五级:表空间、段、区、页、行。1.表空间从InnoDB存储引擎的逻辑存储结构看,所有数据都被逻辑地存放在一个空间中,称之为表空间(tablespace)。从功能上来看,InnoDB存储引擎的表空间..原创 2022-02-09 23:00:00 · 1334 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-3】-MySQL逻辑架构图
1.Server层1.Connectors指的是各种形式的与MySQL交互的客户端。包括JDBC客户端、mysql自带的客户端、Navicat、sqlyog等客户端工具。2.Management Serveices & Utilities系统管理和控制工具3.Connection Pool: 连接池管理用户连接,等待处理连接请求。负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每一个连接上 MySQL Server 的客..原创 2022-02-08 22:00:00 · 401 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-2】-MySQL文件结构
MySQL是通过文件系统对数据和索引进行存储的。MySQL从物理结构上可以分为日志文件和数据索引文件。MySQL在Linux中的数据索引文件和日志文件通常放在/var/lib/mysql目录下。1.日志文件(顺序IO)MySQL通过日志记录了数据库操作信息和错误信息。常用的日志文件包括错误日志、二进制日志、查询日志、慢查询日志和事务Redo 日志、中继日志等。可以通过命令查看当前数据库中的日志使用信息mysql> show variables like 'log_%';原创 2022-02-07 22:00:00 · 373 阅读 · 0 评论 -
【高并发高性能高可用之海量数据MySQL实战-1】-MySQL 8.0安装
一、环境介绍操作系统:CentOS 7MySQL:8.0二、MySQL的卸载1、查看MySQL软件rpm -qa|grep mysql2、卸载MySQLyum remove -y mysql mysql-libs mysql-commonrm -rf /var/lib/mysqlrm /etc/my.cnf查看是否还有 MySQL 软件,有的话继续删除。软件卸载完毕后如果需要可以删除 MySQL 的数据库: /var/lib/mysql三、安装MySQ..原创 2022-02-06 22:00:00 · 506 阅读 · 0 评论