引言

本书学习目标是熟知并能够给同事讲解数据库表的设计、索引的设计、常见的查询优化。

第一章

MySQL服务器的架构图

Mysql服务器是三层架构。

  • 第一层是连接池,授权认证,安全等
  • 第二层是Mysql比较有意思的部分。大多数Mysql的核心服务功能都在这一层,包括查询解析,分析、优化、缓存以及所有的内置函数,所有的跨存储引擎的功能都在这一层实现:存储过程,触发器,视图。
  • 第三层包含了存储引擎。存储引擎负责Mysql中数据的存储和读取。服务器通过API与存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异。存储引擎只是响应上层服务器的请求。
    注:Mysql在查询解析,分析优化阶段是会请求存储引擎获取数据的分布,辅助生成最优的执行计划

各个阶段的主要工作内容

连接管理和安全性

客户端的每个连接都会在服务器进程中拥有一个线程,这个连接的查询在这个单独的线程内完成。
使用连接池来管理线程。
对用户名和密码进行认证,证书认证,并验证是否具有执行某个特定查询的权限。

优化与执行

解析查询,抽象成解析树。进行各种优化(重写查询,决定表的读取顺序,以及选择合适的索引等)。可以通过hint提示优化器,影响决策过程。也可以使用explain查看优化过程。优化器的优化查询是会受存储引擎影响的。
命中了查询缓存,就不必进行查询解析,优化和执行的整个过程。

并发控制

共享锁:共享锁之间互相不阻塞,支持并发读取同一资源,共享锁和排他锁之间会互相阻塞
排他锁:排他锁之间互相阻塞,与共享锁页互相阻塞。只支持获取到资源锁的用户读取。

锁策略就是在锁的开销(锁管理,加锁和释放锁)和数据的安全性之间需求平衡。每种mysql的引擎都有自己的锁策略和锁粒度。
最重要的锁粒度:
表锁
优点:开销小,管理方便,实现简单
缺点:并发度低

行锁
优点:开销比表锁大,管理复杂,实现复杂
缺点:并发度高

行级锁在存储引擎实现。

事务

事务由存储引擎实现。
事务就是一组原子性的sql查询,或者说是一个独立的单元。
原子性:事务是不借分割的最小执行单位,要么成功,要么失败回滚。
一致性:事务执行完后,数据库总是从一个状态到另一个状态。
隔离性:事务之间是不可见的,通过并发控制,行多版本控制。
持久性:事务提交后,数据不会丢失,永久有效。
原子性通过undo log保证。
一致性通过redo 和undo保证
隔离性通过锁和undo实现的行多版本控制保证。
持久性通过redo保证。

死锁
innodb会检测死锁的循环依赖。回滚持有最少行级排他锁的事务。

事务日志
事务日志可以帮助提高事务的效率。存储引擎在修改表的数据时只需要修改其内存拷贝,再把修改行为记录到持久在硬盘上的事务日志中。事务日志是在一小块磁盘区域的顺序写,避免每次修改数据到磁盘的随机io,大大提高了事务的效率。
称为预写式日志,修改数据需要写两次磁盘。

在事务中混合使用存储引擎
每张表都可以指定存储引擎,在事务使用多张表,表是由不同存储引擎管理的,那么事务回滚时,非事务型存储引擎管理的表将不会得到回滚。

隐式和显式锁定
innodb采用的是两阶段锁定协议。在事务执行过程中,随时都可以执行锁定,锁只有在执行commit或者rollback的时候才会释放,并且所有锁是在同一时刻被释放。锁定都是隐士锁定,innodb会根据隔离级别在需要的时候加锁。
innodb也支持显示锁定,这些语句不属于sql规范。 select 。。。 lock in share model ,select 。。。 for update。

lock tables tb [read | write]和unlock tables

多版本并发控制

MVCC的实现,是通过保存数据在某个时间点的快照实现的。有乐观并发控制和悲观并发控制两种。
InnoDB的MVCC是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的创建时间,一个保存了行的过期时间(或删除时间),确切的说保存的是系统版本号。每开始一个新的事物,系统版本号都会自动递增,事物开始时刻的系统版本号会作为事务的版本号。

在RR隔离级别下,MVCC具体是怎么操作的:
Select
a.InnoDB只查找创建版本号小于当前事务版本号数据,或者是本事务修改或新增的数据。
b.只查询寻删除版本号大于本事务版本号
Insert
InnoDB为新插入的每一行保存当前系统版本号作为行版本号
Delete
InnoDB为删除的每一行保存当前系统版本号作为行删除标识。
Update
InnoDB为原来的行保存行删除标识,新增一行记录创建版本号为本事务的行版本号。

多版本并发控制在RR和RC的隔离级别下工作。其他隔离级别不兼容。区别在于RC读取的行最新版本记录,RR的读取规则在上面。

普通查询都是快照读,符合MVCC的逻辑。
当前读使用锁来解决脏读,不可重复读和幻读问题。

Mysql的存储引擎

mysql5.1版本之前默认的存储引擎是MyISAM,之后便是Innodb

MyISAM

加锁与并发
表锁级别的并发,但是可以并发插入:表的查询和插入可以并发进行

修复
支持修复因为异常原因宕机导致的不完整数据(删除)

索引特性
支持对Blob和text等长字段的前500个字符创建索引

压缩表
压缩表不能修改,但是会大大减少磁盘IO占用,提示查询性能。

临时表

sql中使用的临时表就是memory引擎的表

InnoDB

hash索引,支持事务,行锁,崩溃自动恢复,聚簇索引

高性能MySQL读书笔记——开天辟地相关推荐

  1. 高性能MySQL读书笔记 (五)

    1. 优化服务器设置 MySQL有大量的可以修改的参数,但不应该随便修改.应该将更多时间花在schema的优化,索引,查询设计上 配置文件路径: 通常在/etc/my.cnf 不建议动态修改变量,因为 ...

  2. 高性能MySQL读书笔记---查询优化

    查询优化 查询缓慢的原因 是否向数据库请求了不必要的数据 1.查询时是否返回了全部或者大部分数据然后再进行处理的. 2.进行单查或者多表联查时是否返回了全部列数据.例如: SELECT * FORM ...

  3. 高性能MYSQL读书笔记1

    一. 1 每个 客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行,该线程只能轮流在某个CPU核心或者cpu中运行.服务器会负责缓存线程,因此不需要为每一个新建的连接创 ...

  4. 高性能MySQL读书笔记

    数据类型 整数类型 类型 位数 TINYINT 8 SMALLINT 16 MEDIUMINT 24 INT 32 BIGINT 64 int(1) 和int(28)存储的位数相同,mysql不会限制 ...

  5. mysql数据库介绍笔记_MySQL数据库之MySQL读书笔记

    本文主要向大家介绍了MySQL数据库之MySQL读书笔记,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. mysql> CREATE TABLE tb6( -> id  ...

  6. 高性能MySQL读书计划

    知识星球 码农翻身(作者:刘欣)的读书活动 读书群规则: 入群需要交100元押金, 每周需要交作业输出一篇不少于200字的读书笔记, 读书分三阶段进行, 如果每个阶段没交作业的次数>=2 , 押 ...

  7. 高性能mysql学习笔记--复制

    高性能mysql 十:复制 1,复制的概述 复制解决的基本问题是让一台服务器的数据与其他服务器要保持同步. 两种方式:基于行的复制和基于语句的复制,都是通过在主库上记录二进制日志,在备库上重放日志来实 ...

  8. 高性能mysql学习笔记--索引

    高性能mysql 五:索引 1,B-Tree索引 全值匹配:匹配所有列. 匹配最左前缀:只使用索引的第一列. 匹配列前缀:只使用索引的第一列. 匹配范围值:只使用索引的第一列. 精确匹配某一列并范围匹 ...

  9. 高性能mysql学习笔记--高级特性

    高性能mysql 七:高级特性 1,分区表 分区表是一个独立的逻辑表,但是底层由多个无力字表组成,实现分区的代码实际上是对一组地层表的句柄对象的封装,对分区表的请求,都会通过句柄对象转化成对储存引擎的 ...

  10. 高性能MySQL读书摘要(五)创建高性能的索引

    索引优化应该是最有效的优化手段了."最优"的索引有时比一个"好的"索引性能要好两个数量级.创建一个真正的"最优"的索引经常需要重写查询,所以 ...

最新文章

  1. css改变背景透明度
  2. 【Learning Spring 5.0】001 Spring架构及Spring介绍
  3. 剑指offer 算法(栈和队列 查找和排序)
  4. 满意度调查access模板_洪安镇推进综合便民服务中心标准化建设,着力提升群众满意度...
  5. Spark启动程序:Master
  6. 开发里程碑计划_里程碑——让你轻松控制项目进度
  7. linux红帽6架设apache,linux Redhat6.5 中 编译安装apache
  8. intellij IDEA:Error : java 不支持发行版本xxx 的问题
  9. 拍照手抖有救了!DeblurGAN消除运动模糊效果惊人 | 附论文+代码
  10. QML 获取当前时间戳 yyyy-MM-dd hh:mm:ss.zzz
  11. CUDA进阶资料专题(一)pinned memory 和 unified memory
  12. 孢子社群:今日推荐人工智能微信群:TensorflowNews.com 9群
  13. 世界上最优秀的二十款防火墙
  14. 计算机毕设之 餐厅点餐app
  15. pyecharts 地图绘制
  16. LintCode 5: Kth Largest Element
  17. 吉时利Keithley软件2400|2440|2450|2460|2461|2470 NS-SourceMeter源表软件
  18. ccf z字形 java,Java具有简单、 __________ 、稳定、与平台无关、解释型、多线程、动态等特点。...
  19. SpringBoot+Nacos+OpenFeign环境搭建
  20. WIN10打印机如何连接到计算机,win10电脑怎么添加打印机,教您电脑如何添加打印机的方法...

热门文章

  1. 数学模型——泊车模型(2022年Mathorcup数学建模挑战赛C题,含Matlab代码)
  2. SQL删除重复数据并只保留一条
  3. 海思Hi3518EV200 SDK源码分析笔记
  4. hp1015驱动64位_HP LaserJet 1015 驱动下载
  5. cad2010多个文件并排显示_CAD2010如何设置 使一个窗口打开多个文件,并排显示(和360浏览器类似的并排缩略)?...
  6. 【高数】幂级数求和函数问题:用变限积分?积分下限是0?S(0)怎么求?求和时起始项n和角标有规定吗?
  7. Java速成课程建议
  8. android 网页取词,有道词典屏幕取词怎么用?,你知道吗?在浏览网页
  9. EOS钱包、账号及其关系详解
  10. xdf文件转换成pdf_PDF文件转换成PPT演示文稿教程