mysql技术内幕

本文深入探讨了MySQL数据库的内部机制,包括数据库实例、配置文件读取、存储引擎如MyISAM和InnoDB的区别,以及InnoDB的内存结构、锁机制、事务处理和日志系统。重点介绍了InnoDB的缓冲池、重做日志、事务隔离级别以及锁的类型,如行锁、间隙锁和临键锁。文章还涵盖了幻读问题、死锁检测以及事务的ACID属性。
摘要由CSDN通过智能技术生成

数据库 和 数据库实例

  1. 数据库
    1. 数据库是 物理操作系统文件 和 其他形式文件类型的集合 (就是数据库是一系列存储数据文件的统称)
  2. 数据库实例
    1. 数据库实例 是用户操作修改数据库是的软件 (用户操作数据库文件不能直接修改,需要通过数据库实例进行sql操作)

mysql 数据库配置文件读取顺序

  1. linux (mysql --help | grep my.cnf)
    1. /etc/my.cnf
  2. windows (mysql --help)
    1. /etc/my.cnf
  3. 多个配置文件有同一个相同的参数,以读取的最后一个配置文件为准

datadir 地址

  1. 查看方式 进入mysql
  2. SHOW VARIABLES LIKE ‘datadir’\G;
  3. /usr/local/mysql/data/ 指向 /opt/mysql_data 目录
  4. (用户需要具有该目录的用户和权限) 默认mysql数据库权限为 mysql:mysql

mysql体系结构

  1. mysql 体系结构图

image.png

  1. 特点:基于插件式的存储引擎实现(开发人员可以通过提供的引擎接口开发自己的存储引擎)

MyISAM存储引擎

MyISAM 存储引擎 和 InnoDB存储引擎的索引区别

mysql日志:redo log、binlog、undo log 区别与作用
https://www.cnblogs.com/wq-blogs/p/11867199.html

数据库分类

  1. OLTP
    1. Online Transaction Processing (在线事务处理)
  2. OLAP
    1. Online analytical processing (在线分析处理)
      | 特征产品 | 数据库(OLTP) | 数据仓库(OLAP) |
      | — | — | — |
      | 离线 | MySQL、Oracle | Apache Hive/Presto |
      | 实时 | Hbase、Tikv | Apache Druid/Kylin |
      | 用户 | 初级的 | 决策者/高级的 |
      | 功能 | 基本 查询 | 分析决策 |
      | 架构 | 面向 应用 | 面向主题 |
      | 数据 | 当前的,二维的 | 历史的,多维的 |
      | 存取 | 百千条 | 上百万条 |
      | 场景 | 简单事务 | 复杂查询 |
      | 用户数 | 上千个 | 上百万个 |
      | 数据量 | MB ~ GB | GB、TD、PB、EB |

InnoDB存储引擎

多个内存块组成一个大的内存池,进行工作

  1. 维护所有进程/线程需要访问的多个内部数据结构
  2. 缓存磁盘上的数据,方便快速读取,同时在对磁盘文件做修改之前在内存池做缓存
  3. 重做日志(redo log)缓冲

image.png

后台线程

后台线程主要进行刷新内存池的数据,保证缓冲池中的内存缓存是最新的数据。同时将已经修改的数据文件刷新到磁盘文件,保证数据库发生异常InnoDB能恢复到正常运行状态

  1. Master Thread

核心后台线程:将缓冲池中的数据异步刷新到磁盘,保证数据的一致性

  1. 脏页刷新
  2. 合并插入缓冲(INSERT BUFFER)
  3. UNDO 页的回收
  4. IO Thread

负责IO请求回调处理,类型write,read,insert buffer,log 。read 和 write在 InnoDB1.0 后增大到了4个,分别使用innodb_read_io_threads 和 innodb_write_io_threads 进行设置

  1. Purge Thread

回收已经使用并分配的undo页(1.1版本后)

  1. Page Cleaner Thread

将之前版本脏页刷新都放入该线程,减少Master Thread的压力,减少用户查询线程的阻塞(1.2版本开始)

内存

缓冲池

InnoDB 基于磁盘存储,将记录按照页的方式进行管理。读取页时候,先将磁盘的页读取到缓冲池中,下一次读取先判断该页是否在缓冲池中,在直接命中,否则,读取磁盘上的页到缓冲池中。

  1. 修改数据库中的页 ,先修改缓冲池中的页,然后再以一定频率刷新到磁盘上。(不是每次修改页都要刷新进入磁盘,而是使用Checkpoint的机制进行刷盘)
  2. innodb_buffer_pool_size 设置缓冲池大小
  3. 缓冲池数据类型
    1. 索引页
    2. 数据页
    3. undo 页
    4. 插入缓冲
    5. 自适应hash索引
    6. 锁信息
    7. 数据字典信息

image.png

  1. innodb_buffer_pool_instances 设置缓冲池个数,页通过hash分布到不同缓冲池中

LRU List , Free List 和 Flush List
  1. LRU List
    1. innodb 对 LRU算法进行改进,加入midpoint 位置,新读取的页不是直接放到 LRU list 的头部,而是放入 midpoint 位置。默认在5/8处。 innodb_old_blocks_pct 设置midpoint 位置,默认为37。(3/8位置)。midpoint 之后列表 为old列表,之前为new列表,new列表为热点数据
    2. 对 LRU 算法改进的原因:因为某些SQL操作 可能使缓冲池中的页被刷新出,例如索引或者数据库的扫描
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值