MySQL

A collection of 13 posts
MySQL数据库——版本号机制和CAS(Compare And Swap)
MySQL

MySQL数据库——版本号机制和CAS(Compare And Swap)

大家好,这里是编程Cookbook。本文详细介绍乐观锁的两种实现方式:版本号机制和CAS(Compare And Swap)。 MySQL 内置的并发控制机制 MySQL 内置了强大的并发控制机制,例如 MVCC(多版本并发控制) 和锁机制。这些机制在更高层次上实现了并发控制。自动处理事务隔离和并发冲突,适用于复杂数据库事务管理。 MVCC(多版本并发控制) * 核心:基于事务 ID 和 Undo Log,实现高效的读写并发。 * 特点:快照读无需加锁,写操作使用回滚日志实现隔离性。 MVCC的详细信息参考:《MySQL数据库——多版本并发控制MVCC》 锁机制 1. 按锁粒度:表锁、行锁(InnoDB 默认)。 2. 按锁类型:共享锁(S 锁)、排他锁(X 锁)。 3. 意向锁:
6 min read
MySQL数据库——主从复制
MySQL

MySQL数据库——主从复制

大家好,这里是编程Cookbook。本文详细介绍 MySQL 的主从复制,从原理到配置再到同步过程。 简介 MySQL 主从复制(Replication)是一种数据分布式存储技术,通过将主库(Master)的数据和操作复制到一个或多个从库(Slave),实现数据的同步和备份。它常用于读写分离、数据容灾、数据分布等场景。 核心组件 1. 主库(Master): * 负责记录所有数据变更操作到 Binary Log 中。 * 通过网络将 Binary Log 提供给从库。 2. 从库(Slave): * 负责从主库获取 Binary Log,并通过中继日志(Relay Log)将其重放在本地,最终实现与主库的数据同步。 3. 二进制日志(Binary Log): * 主库记录所有数据的逻辑操作,用于主从复制和增量备份。 * 包含数据变更的具体操作(语
10 min read
MySQL数据库——多版本并发控制MVCC
MySQL

MySQL数据库——多版本并发控制MVCC

大家好,这里是编程Cookbook。本文详细介绍MySQL的并发控制:多版本并发控制MVCC。 背景介绍 许多人认为 MVCC(Multi-Version Concurrency Control,多版本并发控制) 是一种乐观锁的实现方式,我们先来了解一下什么是乐观锁和悲观锁。 数据库并发控制——锁机制 在数据库系统中,并发控制是保证多个事务在并发执行时数据一致性的核心技术。传统的并发控制方法是使用 锁,它是一种直接而有效的解决方案。 * 锁的分类: * DQL(Data Query Language,数据查询语言):查询数据(如 SELECT)时使用 读锁。 * DML(Data Manipulation Language,数据操作语言):对数据进行增、删、改操作(如 INSERT、DELETE、UPDATE)时使用 写锁。 * DDL(Data Definition Language,数据库定义语言)
13 min read
MySQL数据库——常见慢查询优化方式
MySQL

MySQL数据库——常见慢查询优化方式

大家好,这里是编程Cookbook。本文详细介绍MySQL的慢查询相关概念,分析步骤及其优化方案等。 什么是慢查询日志? 慢查询日志是MySQL提供的一种日志记录机制,用于记录执行时间超过指定阈值(long_query_time)的SQL语句。通过慢查询日志,可以识别和优化性能较差的SQL查询,是数据库性能调优的重要工具。 * 关键点: * 默认阈值:long_query_time 默认值为 10秒,表示运行时间超过10秒的SQL会被记录。 * 默认状态:MySQL 默认未开启慢查询日志,需要手动启用。 * 日志存储方式:支持存储为文件或表。 慢查询日志的相关参数 MySQL慢查询日志的核心参数及其含义如下: 1. 启用和路径配置: * slow_query_log:是否开启慢查询日志,1 表示开启,0 表示关闭。 * slow-query-log-file:日志文件路径和名称(MySQL 5.6及以上版本)。 * log-slow-que
10 min read
MySQL数据库——日志介绍
MySQL

MySQL数据库——日志介绍

大家好,这里是编程Cookbook。本文详细介绍MySQL的日志类型及其作用,包括 Redo Log、Undo Log、Binary Log 和 Error Log 等,在事务维护,主从同步,慢查询等方面都至关重要。 日志类型 MySQL 中用于数据持久化和恢复的日志机制非常关键,常见的日志类型包括 Redo Log、Undo Log、Binary Log 和 Error Log 等。每种日志都有特定的作用,确保数据库在不同情况下的可恢复性、事务的隔离性和一致性。 这些日志在 MySQL 的数据库操作流程中相互配合,确保数据库的高可用性和高一致性: 1. Undo Log 支持事务的隔离性,并允许回滚事务。 2. Redo Log 保证数据持久性,支持事务提交后的崩溃恢复。 3. Binary
17 min read
MySQL数据库——索引潜规则(最左前缀原则)
MySQL

MySQL数据库——索引潜规则(最左前缀原则)

大家好,这里是Good Note,关注 公主号:Goodnote,专栏文章私信限时Free。本文详细介绍MySQL索引的关键潜规则——最左前缀原则。 @[toc] 图示单值索引和联合索引 单值索引 * 单值索引(唯一索引、主键索引、全文索引等) 是指在数据库表中创建的、仅涉及单个列的索引。也就是说,单值索引是基于表中的单一列(例如,单个字段)创建的索引结构。单值索引底层的 B+ 树如下所示: 联合索引 * 与单值索引只在一个列上建立,联合索引建在多个列上的索引,通常用于优化多列查询。当查询条件中涉及多个列时,数据库引擎会使用最适合的索引来提高查询效率。 * 联合索引的列顺序非常重要,通常是根据查询中最常用的过滤列进行排序。 联合索引的结构依旧是一颗 B+ 树,只不过联合索引的键值数量不是一个,而是多个,如下图所示: 当索引为联合索引时,数据库会依据联合索引最左的字段来构建 B+ 树,也叫 最左前缀匹配原则。 在上图中,我们假如创建一个 (a, b)
6 min read
MySQL数据库——索引潜规则(回表查询、索引覆盖、索引下推)
MySQL

MySQL数据库——索引潜规则(回表查询、索引覆盖、索引下推)

大家好,这里是编程Cookbook。本文详细介绍MySQL索引的三个潜规则——回表查询、索引覆盖、索引下推,以提升数据库的性能。 之前我们在《MySQL数据库——索引介绍》文章中介绍了按存储方式将索引划分为聚集索引和非聚集索引,由此引出了一些索引设计的潜规则(回表查询、索引覆盖、索引下推)。 * 回表查询、索引覆盖、索引下推 是 InnoDB 的核心优化特性,尤其是索引下推,这是 InnoDB 的独有能力。 * 如果使用 MyISAM 或 Memory 存储引擎,只能利用回表查询和索引覆盖,无法使用索引下推优化。 索引回顾 聚集索引(Clustered Index) InnoDB 中的主键索引就是聚簇索引。 * 叶子节点存储整行数据。 * 索引即数据,查询到索引即查询到数据。 * 表中行的物理顺序与键值的逻辑(索引)顺序相同。 * 每个表只能有一个聚集索引,因为索引只能按照一种方式排序。 非聚集索引(Secondary Index/辅助索引/
8 min read
MySQL数据库——索引结构之B+树
MySQL

MySQL数据库——索引结构之B+树

大家好,这里是编程Cookbook。本文先介绍数据结构中树的演化过程,之后介绍为什么MySQL数据库选择了B+树作为索引结构。 树的演化 1. 树 非线性结构,每个节点有唯一的一个父结点和多个子结点(子树),为一对多的关系。 2. 二叉树 每个结点最多有两颗子树,并且子树有左右之分,不能颠倒。 3. 满二叉树 每一层的结点个数都达到了当层能达到的最大结点数。 4. 完全二叉树 除了最下面一层之外,其余层的结点个数都达到了当层能达到的最大结点数,且最下面一层只从左至右连续存在若干结点,右边的结点全部不存在。 5. 二叉查找树 (BST) 又称为二叉排序树、二叉搜索树。定义如下: * 要么二叉査找树是一棵空树。 * 要么二叉查找树由根结点、左子
9 min read
MySQL数据库——事务介绍
MySQL

MySQL数据库——事务介绍

大家好,这里是编程Cookbook。本文详细介绍MYSQL的事务,包括ACID、隔离级别、以及如何解决并发带来的问题。 MySQL事务是对数据库操作的一组处理逻辑单元,通常包括一系列的SQL语句,事务保证了这些语句要么全部成功执行,要么全部失败后回滚。 事务的特性:ACID MySQL中的事务管理机制符合ACID特性,确保数据的一致性、可靠性和完整性。分别是: 1. 原子性(Atomicity) 2. 一致性(Consistency) 3. 隔离性(Isolation) 4. 持久性(Durability) 1. 原子性(Atomicity) 定义: * 事务中的所有操作要么全部完成,要么全部不做,不能只执行部分操作。换句话说,事务是“原子”级的,事务的操作不可分割。 * 如果事务在执行过程中发生错误,所有已执行的操作都会回滚,数据会恢复到事务开始之前的状态。 实现原理: 原子性通过 undo log 来实现。事务执行过程中,如果发生错误或用户执行了回滚(
21 min read
MySQL数据库——索引介绍
MySQL

MySQL数据库——索引介绍

大家好,这里是编程Cookbook。本文详细介绍MySQL数据库中的索引,包括索引结构设计(B+树、哈希等)、用途(主键索引、唯一索引等)、聚集索引和非聚集索引,以及索引创建和使用的原则等。 按底层数据结构分类 MySQL 提供了四种主要的索引实现,每种索引类型有不同的应用场景和特点。以下是这四种索引类型: 索引类型 适用场景 支持的操作 优缺点 存储引擎支持 B+树 索引 常规查询(等值、范围、排序) 等值查询 (=)、范围查询 (>、<)、排序 (ORDER BY)、like、联合索引 优点:高效适配大多数查询操作 缺点:不适合哈希快速定位 InnoDB 和 MyISAM ,Memory(默认情况下是使用哈希索引) 哈希索引 等值查询 等值查询
20 min read
MySQL数据库——常见的几种锁分类
MySQL

MySQL数据库——常见的几种锁分类

大家好,这里是编程Cookbook。本文详细介绍MySQL的几种常见锁分类,如:表级锁、行级锁、页面锁、悲观锁、乐观锁、共享锁、排他锁、Gap-锁等。 按锁粒度分 表级锁 * 开销小,加锁快,不会出现死锁,锁粒度大(整张表)。 * 并发度低,发生锁竞争概率大,适合查询。 行级锁 * 开销大,加锁慢,会出现死锁,锁粒度最小(一行数据)。 * 并发度高,发生锁竞争概率小,适合并发写,事务控制。 页面锁 * 开销、加锁速度、锁粒度、并发度都介于表级锁和行级锁之间,会出现死锁。 总结 很难说哪种锁更好,只能根据具体应用程序的特点选择合适的锁。 * 对于查询远大于修改的场景,表级锁是合适的,因为锁粒度大但管理简单。 * 对于并发查询并发更新少量数据的应用,行级锁是更合适的选择,它提供更高的并发性和灵活性。 InnoDB的默认锁是行级锁,但通过意向锁机制实现了多粒度锁的协同工作。 锁与索引关系
15 min read
MySQL数据库——存储引擎(InnoDB、MyISAM、MEMORY、ARCHIVE)
MySQL

MySQL数据库——存储引擎(InnoDB、MyISAM、MEMORY、ARCHIVE)

大家好,这里是编程Cookbook。本文详细介绍MySQL数据库重要的存储引擎及其适用场景:InnoDB、MyISAM、MEMORY、ARCHIVE。 MySQL的存储引擎(Storage Engine)是用于管理数据存储和数据访问的程序模块。常用的存储引擎有 InnoDB(事务处理和高并发,默认存储引擎)、MyISAM(高查询性能,但不支持事务)、Memory(高速缓存)等。 * InnoDB:适用于大多数业务场景,提供事务、行级锁和外键支持,是MySQL的默认存储引擎。 * MyISAM:适用于读多写少、对事务一致性要求不高的场景。 * MEMORY:适用于需要高速缓存的场景,但数据会在数据库重启时丢失。 * ARCHIVE:适用于存储大量归档数据,不支持更新操作。 * CSV:适用于导出和交换数据的场景,数据以CSV格式存储。 * NDB (Cluster):适用于分布式、高可用性和高扩展性的场景,通常用于MySQL Cluster。 * FEDERATED:适用于跨数据库查询,允许访问远程数据库中的数据。 * BLACKHOLE:适用于数据复制,
11 min read
MySQL数据库——数据库三范式
MySQL

MySQL数据库——数据库三范式

大家好,这里是编程Cookbook。本文简要介绍关系型数据库设计的三范式。 数据库的三范式(3NF)是关系数据库设计中用于减少数据冗余、避免数据异常和提高数据一致性的三种规范化标准。 以下是 第一范式(1NF)、第二范式(2NF) 和 第三范式(3NF) 的详细介绍: 范式 第一范式(1NF) 要求每一列都是不可拆分的原子项。 第二范式(2NF) 第二范式要求属性完全依赖于主键,而不能只依赖于主键的一部分。满足 第一范式 的基础上,解决部分依赖(Partial Dependency)的问题。 * 关系必须满足 第一范式。 * 消除部分依赖:对于复合主键(即由多个列组成的主键),非主属性必须依赖于整个复合主键,而不是依赖于主键的一部分。 订单表中出现业务线,不同业务线的订单价格不同,那么主键就必须是订单id和业务线id(完全依赖)。 第三范式(3NF) 第三范式要求属性直接依赖于主键,不依赖于通过其他非主属性间接依赖于主键。 * 关系必须满足 第二范式。 * 消除传递依赖:任何非主属性都不能通过其他非主属性间接依赖
3 min read