数据库 和 数据库实例
- 数据库
- 数据库是 物理操作系统文件 和 其他形式文件类型的集合 (就是数据库是一系列存储数据文件的统称)
- 数据库实例
- 数据库实例 是用户操作修改数据库是的软件 (用户操作数据库文件不能直接修改,需要通过数据库实例进行sql操作)
- 数据库实例 是用户操作修改数据库是的软件 (用户操作数据库文件不能直接修改,需要通过数据库实例进行sql操作)
mysql 数据库配置文件读取顺序
- linux (mysql --help | grep my.cnf)
- /etc/my.cnf
- windows (mysql --help)
- /etc/my.cnf
- 多个配置文件有同一个相同的参数,以读取的最后一个配置文件为准
datadir 地址
- 查看方式 进入mysql
- SHOW VARIABLES LIKE ‘datadir’\G;
- /usr/local/mysql/data/ 指向 /opt/mysql_data 目录
- (用户需要具有该目录的用户和权限) 默认mysql数据库权限为 mysql:mysql
mysql体系结构
- mysql 体系结构图
- 特点:基于插件式的存储引擎实现(开发人员可以通过提供的引擎接口开发自己的存储引擎)
MyISAM存储引擎
MyISAM 存储引擎 和 InnoDB存储引擎的索引区别
mysql日志:redo log、binlog、undo log 区别与作用
https://www.cnblogs.com/wq-blogs/p/11867199.html
数据库分类
- OLTP
- Online Transaction Processing (在线事务处理)
- OLAP
- Online analytical processing (在线分析处理)
| 特征产品 | 数据库(OLTP) | 数据仓库(OLAP) |
| — | — | — |
| 离线 | MySQL、Oracle | Apache Hive/Presto |
| 实时 | Hbase、Tikv | Apache Druid/Kylin |
| 用户 | 初级的 | 决策者/高级的 |
| 功能 | 基本 查询 | 分析决策 |
| 架构 | 面向 应用 | 面向主题 |
| 数据 | 当前的,二维的 | 历史的,多维的 |
| 存取 | 百千条 | 上百万条 |
| 场景 | 简单事务 | 复杂查询 |
| 用户数 | 上千个 | 上百万个 |
| 数据量 | MB ~ GB | GB、TD、PB、EB |
- Online analytical processing (在线分析处理)
InnoDB存储引擎
多个内存块组成一个大的内存池,进行工作
- 维护所有进程/线程需要访问的多个内部数据结构
- 缓存磁盘上的数据,方便快速读取,同时在对磁盘文件做修改之前在内存池做缓存
- 重做日志(redo log)缓冲
后台线程
后台线程主要进行刷新内存池的数据,保证缓冲池中的内存缓存是最新的数据。同时将已经修改的数据文件刷新到磁盘文件,保证数据库发生异常InnoDB能恢复到正常运行状态
- Master Thread
核心后台线程:将缓冲池中的数据异步刷新到磁盘,保证数据的一致性
- 脏页刷新
- 合并插入缓冲(INSERT BUFFER)
- UNDO 页的回收
- IO Thread
负责IO请求回调处理,类型write,read,insert buffer,log 。read 和 write在 InnoDB1.0 后增大到了4个,分别使用innodb_read_io_threads 和 innodb_write_io_threads 进行设置
- Purge Thread
回收已经使用并分配的undo页(1.1版本后)
- Page Cleaner Thread
将之前版本脏页刷新都放入该线程,减少Master Thread的压力,减少用户查询线程的阻塞(1.2版本开始)
内存
缓冲池
InnoDB 基于磁盘存储,将记录按照页的方式进行管理。读取页时候,先将磁盘的页读取到缓冲池中,下一次读取先判断该页是否在缓冲池中,在直接命中,否则,读取磁盘上的页到缓冲池中。
- 修改数据库中的页 ,先修改缓冲池中的页,然后再以一定频率刷新到磁盘上。(不是每次修改页都要刷新进入磁盘,而是使用Checkpoint的机制进行刷盘)
- innodb_buffer_pool_size 设置缓冲池大小
- 缓冲池数据类型
- 索引页
- 数据页
- undo 页
- 插入缓冲
- 自适应hash索引
- 锁信息
- 数据字典信息
- innodb_buffer_pool_instances 设置缓冲池个数,页通过hash分布到不同缓冲池中
LRU List , Free List 和 Flush List
- LRU List
- innodb 对 LRU算法进行改进,加入midpoint 位置,新读取的页不是直接放到 LRU list 的头部,而是放入 midpoint 位置。默认在5/8处。 innodb_old_blocks_pct 设置midpoint 位置,默认为37。(3/8位置)。midpoint 之后列表 为old列表,之前为new列表,new列表为热点数据
- 对 LRU 算法改进的原因:因为某些SQL操作 可能使缓冲池中的页被刷新出,例如索引或者数据库的扫描