数据库
文章平均质量分 88
盛夏温暖流年
做一个乐观善良而温暖的人,好好学习,成为更优秀的自己。
展开
-
Mysql学习专栏之八(从删除操作分析Mysql中的表收缩)
当我们的数据库占用空间过大时,经常会想到通过删除部分数据来释放空间,但往往操作完成后会发现表文件的大小并没有发生改变,这是为什么呢?首先,来看一下数据删除的流程,之后再来分析这个问题产生的原因。一.数据删除流程我们知道,InnoDB 里的数据都是用 B+ 树的结构组织的,如下图所示:假设,我们要删掉 R4 这个记录,InnoDB 引擎只会把 R4 这个记录标记为删除。如果之后要再插入一个 ID 在 300 和 600 之间的记录时,可能会复用这个位置,但是,磁盘文件的大小并不会缩小。而InnoD原创 2020-08-06 10:27:23 · 391 阅读 · 0 评论 -
Mysql学习专栏之七(浅析Mysql中的binlog)
binlog 可以用来归档,也可以用来做主备同步,MySQL 能够成为现下最流行的开源数据库,binlog 功不可没。在最开始,MySQL 是以容易学习和方便的高可用架构,被开发人员青睐的。而它的几乎所有的高可用架构,都直接依赖于 binlog。虽然这些高可用架构已经呈现出越来越复杂的趋势,但都是从最基本的一主一备演化过来的,那么我们就先来看一下主备的基本原理。一. MySQL 主备的基本原理MySQL 主备切换流程如下图所示:在状态 1 中,客户端的读写都直接访问节点 A,节点 B 是 A 的备原创 2020-07-19 10:59:09 · 361 阅读 · 0 评论 -
Mysql学习专栏之六(浅析Mysql中的脏页刷新)
一. InnoDB 刷脏页流程InnoDB 在处理更新语句的时候,只做了写日志这一个磁盘操作。这个日志叫作 redo log(重做日志),在 更新内存 并 写完 redo log 后,就返回给客户端,本次更新成功。但实际上,对应的数据没有被更新到磁盘,系统总要找时间把数据写入磁盘,这个写入过程的术语就是 flush。当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。写入过程如下图所示:那么,什么情况会原创 2020-07-08 18:02:48 · 1147 阅读 · 2 评论 -
Mysql学习专栏之五(Mysql中的全局锁,表级锁和行锁)
数据库锁设计的初衷是处理并发问题。作为多用户共享的资源,当出现并发访问的时候,数据库需要合理地控制资源的访问规则。锁就是起到这样的作用。根据加锁的范围,MySQL 里面的锁大致可以分成全局锁、表级锁和行锁三类。一. 全局锁全局锁其实就是对整个数据库实例加锁,MySQL 提供了2种加全局读锁的方法:Flush tables with read lock (FTWRL)set global readonly=true相同点一个库被全局锁上以后,数据更新语句(数据的增删改)、数据定义语句(包括建原创 2020-07-03 10:27:21 · 329 阅读 · 0 评论 -
Mysql学习专栏之四(Mysql索引的实际应用)
一. 普通索引 vs 唯一索引当我们添加索引的时候,不同的业务场景会选择不同的索引类型。假设当前有一个表为域名表,其中的域名字段默认是不重复的,业务常用查询如下:select id,domain_name from domain where domain_name = 'baidu.com';为了加快查询效率,我们一般会在domain_name字段上添加索引,那此时我们该选择普通索引还是唯一索引比较合适呢?接下来,我们就从这两种索引对查询语句和更新语句的性能影响来进行分析。查询语句查询语句会原创 2020-06-25 16:26:20 · 474 阅读 · 0 评论 -
Mysql学习专栏之三(Mysql索引)
一.索引简介数据库索引是为了增加查询速度而对表字段附加的一种标识。数据库在执行一条Sql语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合。如果我们对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。但也不是任何情况下都应该添加索引,有几个反例:1、如果每次都需要取到所有表记录,无论如何都必须进行...原创 2020-06-11 17:35:28 · 402 阅读 · 0 评论 -
Mysql学习专栏之二(Mysql日志模块)
MySQL有两大重要的日志模块:redo log(重做日志)和 binlog(归档日志)。一.redo log二.binlog原创 2020-06-11 14:01:12 · 341 阅读 · 0 评论 -
Mysql学习专栏之一(Mysql基础架构)
MySQL 可以分为 Server 层和存储引擎层两部分,如下图所示:Server 层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖 MySQL 的大多数核心服务功能,以及所有的内置函数(如日期、时间、数学和加密函数等),所有跨存储引擎的功能都在这一层实现,比如存储过程、触发器、视图等。而存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持 InnoDB、MyISAM、Memory 等多个存储引擎。现在最常用的存储引擎是 InnoDB,它从 MySQL 5.5.5 版本开始成为...原创 2020-06-07 14:19:18 · 440 阅读 · 0 评论 -
sql分组查询group by结合count,sum统计语句的实现(附带sql详细分析步骤)
日常写代码经常会遇到数据统计的业务场景,分组查询 group by 结合 count 和 sum 的复杂语句写起来容易令人头大,在这里分享几种常用的统计场景,做个记录的同时也希望能帮到大家。场景1:统计每个学生的加分次数/总加分 and 减分次数/总减分库表结构如下所示:学生分数表:student_score字段名含义字段类型备注id自增编号bigintstudent_name学生姓名varcharscore分数doublesort分数类原创 2021-04-22 11:36:20 · 39756 阅读 · 2 评论 -
【MySQL】双主双从 + 多源复制架构分析和部署
本文主要介绍 MySQL 数据库的双主双从架构, 其中主从同步采用多源复制的机制。一. 数据库架构介绍本次搭建的 MySQL 数据库架构图如下所示:其中,master1 和 master2 是两台主库,负责数据增删改操作。这两台主库的主从关系为互为主从,且在 Haproxy 中配置 master1 是主库,master2 是备库,正常情况下 master1 提供数据增删改操作,master2 作为备份库实时同步 master1 的数据更新,一旦主库 master1 出现异常,Haproxy 将会切原创 2021-05-11 17:15:47 · 806 阅读 · 7 评论 -
深入理解悲观锁和乐观锁机制
在探讨悲观锁和乐观锁之前,我们先要理解什么是锁。锁是在并发环境下,控制多个操作的顺序执行,以此来保证数据安全变动的一种机制。它是一种保证数据安全的手段,而不是特定于某项技术的,悲观锁和乐观锁亦是如此。针对于不同的业务场景,应该选用不同的并发控制方式。所以,不要把乐观并发控制和悲观并发控制狭义的理解为DBMS中的概念,更不要把他们和数据中提供的锁机制(行锁、表锁、排他锁、共享锁)混为一谈。实际上,在DBMS中,悲观锁正是利用数据库本身提供的锁机制来实现的。下面我们就来分别介绍一下悲观锁和乐观锁。一.原创 2020-07-26 10:23:59 · 355 阅读 · 1 评论 -
SQL优化技巧总结
1.大量数据的update和delete操作分批执行原始SQL语句:update status=0 FROM `coupon` WHERE expire_date <= #{currentDate} and status=1;如果大量数据需要更新状态,执行这条SQL可能会堵死其他SQL,分批处理伪代码如下:int pageNo = 1;int PAGE_SIZE = 100;w...原创 2020-03-27 13:52:03 · 266 阅读 · 0 评论 -
数据库事务实现原理
一.数据库事务1. 定义数据库事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。2. 典型特性典型特性有原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durabilily),简称ACID。原子性:事务作为一个整体被执行,包含在其中的对数据库...原创 2020-03-07 22:05:32 · 2861 阅读 · 0 评论 -
Kettle7.0实现oracle到mysql数据库迁移
一、Kettle简介Kettle是一款国外开源的ETL工具,纯java编写,可以在Window、Linux、Unix上运行,绿色无需安装,数据抽取高效稳定。kettle的数据抽取主要在于抽取数据,而没有考虑数据库的函数、存储过程、视图、表结构以及索引、约束等等,如果想对这些内容进行迁移,就需要通过写脚本或者更改kettle源码的方式实现了。二、Kettle下载运行以下是Kettle...原创 2018-05-31 16:10:00 · 7315 阅读 · 5 评论 -
Kettle7.0实现主键,索引迁移
之前的博客提到过,kettle的数据抽取主要在于抽取数据,而没有考虑数据库的函数、存储过程、视图、表结构以及索引、约束等,但这些对于数据库来说又是至关重要的,所以我们需要通过修改源码的方式来实现。具体实现方式为:扩展kettle向导中的多表复制菜单里的功能,在该功能创建的作业中添加节点用于添加输出表的主键和索引。一、Kettle源码下载目前我使用的是kettle7.0.0版本,下载的源...原创 2018-06-05 17:05:01 · 3104 阅读 · 3 评论