《高性能Mysql》学习笔记(一)(上)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 《高性能Mysql》学习笔记(一)(上)

前言



Mysql的质量比较好的书其实并不是很多,所以可以说是看一本少一本,这本书也算是学习MYSQL必看的一本书,当然十分厚,虽然版本很老但是讲述的内容都会十分实用的,对于学习MYSQL的人可以说是一本必读的进阶好书。

最后,这篇读书笔记是整理个人以前自学的时候看书做的笔记,做的十分粗糙=-=,现在来看很多笔记记得过于基础了。另外当时很多都是截图的,很多都是图片HHHH(流量观看慎重)。


MySQL逻辑架构图


虽然看上去比较复古,但是挺经典的。


网络异常,图片无法展示
|


小贴士:

存储引擎不会去解析sql, 不同存储引擎不会相互通信,只是简单响应上层请求(InnoDB引擎除外,会解析外键定义,因为mysql服务器本身没有实现该功能


连接管理和安全性


每一个连接都是一个单独线程,服务器会对连接缓存而不是创建或者销毁线程


优化与执行


执行流程:

  1. 解析查询
  2. 创建数据结构(解析树),优化(重写查询,读表顺序优化,选择索引等)
  3. 尝试查询缓存(SELECT)
  4. 返回结果


并发控制



目的:内部拥有锁机制防止数据破坏


共享锁和排他锁(读锁和写锁)


  • 读锁是共享的,相互不阻塞
  • 写锁是排他的,一个写锁会阻止其他读锁和写锁


锁粒度


提高共享资源并发性就是让锁更有选择性,让锁只监控部分数据

记住:任何时候,给定资源下,锁定数据量越少,并发程度越高,只要相互不发生冲突即可

mysql提供多个存储引擎支持丰富的锁策略


表锁 (table lock)


表锁是msyql中最基本的锁策略,开销最小的策略,这种方式类似邮箱的加锁机制:会锁定整张表,用户访问时候,对表进行写操作,需要优先获得写锁,会阻塞其他用户读写操作,只有没有写锁时候,其他用户才能获得读锁,读锁之间是不相互阻塞的,特定场景表锁可以有良好性能。

注意事项:

  1. 写锁读锁更高的优先级,写锁有可能会插入到一个读锁的前面,但是读锁不能插入到写锁队列前面
  2. 服务器会为alter table 等语句默认使用表锁而不是根据引擎决定(虽然存储引擎才是真正干活的)


行级锁 (row lock)


该锁可以最大程度支持并发处理(与此同时带来巨大锁开销),InnoDBXtraDB, 实现了行级锁,行级锁只在存储层也就是存储引擎实现,而mysql服务层没有实现


事务



事务的ACID


  • A(atomicity) 原子性
  • 一个事务是一个不可分割的单位,事务中的所有操作,要么全完成,要么全不完成,任何一个操作的失败,都会回滚到事务执行之前的状态。
  • C (consistency) 一致性
  • 事务结束后,系统状态是一致的。即,在并发操作时,系统的状态也要和串行执行事务时一样。
  • I  (isolation)隔离性
  • 并发执行的事务之间,无法看到彼此的系统状态。
  • D (durability)持续性
  • 在事务完成后,事务对数据库的操作会被持久保存在数据库中,不会被回滚。

事务使用与否根据实际业务情况而定(甚至可以不使用事务,而是使用sql 进行一定的安全措施),如何选择合适的 mysql 引擎来解决问题可能事务本身更加重要。


隔离级别


网络异常,图片无法展示
|


死锁



如果多个线程同时更改同一行数据,你们两个线程互相等待对面的锁,造成死锁


解决方法:


  1. 例如:InnoDB 检测死循环依赖,并且立即返回一个错误(死锁会造成慢查询)。
  2. 查询时间达到锁等待超时设定时间之后放弃锁请求。
  3. InnoDB目前(5.1)处理方法:将持有最少行级排他锁的事务进行回滚
  4. 大多数时候因为数据冲突,有时候确实是因为存储引擎方式引起的!!!


只有部分或者完全回滚一个事务才能打破死锁,事务性系统无法避免。大多数时候只需要重新执行死锁事务即可


事务日志


事务日志采用追加方式,因此I/O的消耗比较小,内存修改数据后台慢慢刷会磁盘,目前大多数存储引擎都是这样实现被称为:预写式日志


mysql中的事务



  • innoDB
  • NDB cluster


自动提交


默认情况下我们所写的SQL默认都是自动提交的,也就是说在执行的时候MYSQL都会给我们自定加上一条,COMMIT语句,也就是自动提交事务,我们可以使用SHOW VARIABLES LIKE 'AUTOCOMMIT'语句查看是否开启自动提交。


网络异常,图片无法展示
|


切记:查找对应版本会产生 AUTO_COMMIT 所有语句


设置隔离级别


命令如下:

> SET SESSION TRASACTION ISOLATTION LEVEL READ COMMITTED

mysql 可以识别 4 个 ansi 隔离级别,innodb 引擎也支持


混合使用存储引擎


mysql 服务层不管理事务,事务下层存储引擎实现,同一个事务使用多种存储引擎不可靠

mysql 对非事务型表不会有提示!!!!

mysql 对非事务型表不会有提示!!!!

mysql 对非事务型表不会有提示!!!!


隐藏和显式锁定


记住下面的两条特点:

  • INNODB 使用两阶段锁定协议,锁只有在执行提交或者回滚才会释放
  • INNODB 会根据隔离级别自动加锁

innodb支持显示的加锁如下:

  1. SELECT ... FROM IN SHARE MODE
  2. SELECT ... FOR UPDATE

注意:这不是sql规范,而是MYSQL自己增加的语法支持

mysql 中的lock 和 unlock tables 语句和存储引擎无关,而是在**服务层**实现,不能用来替代事务性存储引擎,有其他用途

建议:除了事务中禁用autocommit ,可以使用lock tables 之外,其他任何时候不要显式执行 lock tables,不管是什么存储引擎


多版本并发控制(mvcc)



mvcc实现:保存数据在某个时间点的快照实现,记住:根据事务开始时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的,这里可以引申:悲观锁乐观锁


innodb 的 mvvc


实现原理:通过在每行记录后面保存两个隐藏的列实现

  • 一个列保存行创建时间
  • 另一个保存过期时间(删除时间)

事务开始时候系统版本号(每个新事务都会递增版本号)作为事务版本号,和查询到记录的版本号比较

REPEATABLE READ 隔离级别操作


网络异常,图片无法展示
|


MVCC 只在 REPEATABLE READREAD COMMITTED  两个隔离级别工作。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
7月前
|
消息中间件 缓存 弹性计算
纯PHP+MySQL手搓高性能论坛系统!代码精简,拒绝臃肿
本内容分享了一套经实战验证的社交系统架构设计,支撑从1到100万用户的发展,并历经6次流量洪峰考验。架构涵盖客户端层(App、小程序、公众号)、接入层(API网关、负载均衡、CDN)、业务服务层(用户、内容、关系、消息等服务)、数据层(MySQL、Redis、MongoDB等)及运维监控层(日志、监控、告警)。核心设计包括数据库分库分表、多级缓存体系、消息队列削峰填谷、CQRS模式与热点数据动态缓存。同时提供应对流量洪峰的弹性伸缩方案及降级熔断机制,并通过Prometheus实现全链路监控。开源建议结构清晰,适合大型社交平台构建与优化。
305 11
|
2月前
|
SQL 关系型数据库 MySQL
索引设计实战:如何创建高性能MySQL索引
本文深入解析MySQL索引设计的核心原则与实战技巧,涵盖索引选择性、复合索引、性能优化及常见陷阱等内容,通过实际案例帮助开发者创建高效索引,显著提升数据库查询速度,助你打造高性能数据库系统。
|
6月前
|
存储 关系型数据库 MySQL
【免费动手教程上线】阿里云RDS MySQL推出大容量高性能存储:高性能本地盘(最高16TB存储空间)、高性能云盘(最高64TB存储空间)
阿里云RDS MySQL提供高性能本地盘与高性能云盘等存储方案,满足用户大容量、低延迟需求。高性能本地盘单盘最大16TB,IO延时微秒级;高性能云盘兼容ESSD特性,支持IO性能突发、BPE及16K原子写等能力。此外,阿里云还提供免费动手体验教程,帮助用户直观感受云数据库 RDS 存储性能表现。
|
10月前
|
存储 关系型数据库 MySQL
MySQL索引学习笔记
本文深入探讨了MySQL数据库中慢查询分析的关键概念和技术手段。
699 81
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
343 6
|
SQL 关系型数据库 MySQL
Mysql学习笔记(三):fetchone(), fetchmany(), fetchall()详细总结
MySQL中用于数据检索的`fetchone()`, `fetchmany()`, `fetchall()`函数的功能、SQL语句示例和应用场景。
388 3
Mysql学习笔记(三):fetchone(), fetchmany(), fetchall()详细总结
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
237 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
|
关系型数据库 MySQL 数据库
Mysql学习笔记(四):Python与Mysql交互--实现增删改查
如何使用Python与MySQL数据库进行交互,实现增删改查等基本操作的教程。
190 1
|
SQL druid Java
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
188 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)

推荐镜像

更多