MySQL和Redis的区别与联系
MySQL和Redis的区别与联系
1.MySQL和Redis的数据库类型
MySQL是关系型数据库,主要用于存放持久化数据,将数据存储进磁盘(也叫磁盘数据库),读取数据较慢。
Redis是NOSQL,即非关系型数据库,也是内存数据库,基于内存进行存储的单进程单线数据库,即将数据存储在内存中,内存的读取速度快,能够提高运行效率
2.MySQL的运行机制
MySQL作为持久化存储的关系型数据库,每次请求访问数据库都存在I/O操作,如果反复频繁访问数据库会导致负载过高,反复连接也需要时间
(MySQL也有缓存,毕竟只要是从磁盘读出,就肯定会设置有缓存)MySQL里有一个存储引擎一般用于sql执行过程中的内存临时表,8.0之前是memory,后来用tempTable来代替了
innodb操作表时,会将数据页(简单理解为表)导入内存,在内存中操作,然后定期刷回到磁盘中,会缓存索引和数据页,当某些索引值被频繁访问的时候,innodb会自动建立自适应哈希索引
名称 | 中文名 | 占用空间大小 | 简单描述 |
---|---|---|---|
File Header | 文件头部 | 38字节 | 页的一些通用信息 |
Page Header | 页面头部 | 56字节 | 数据页专有的一些信息 |
Infimum+ Supremum |
最小记录和最大记录 | 26字节 | 两个虚拟的行记录 |
User Records | 用户记录 | 不确定 | 实际存储的行记录内容 |
Free Space | 空闲空间 | 不确定 | 页中尚未使用的空间 |
Page Director | 页面目录 | 不确定 | 页中的某些记录的相对位置 |
File Traile | 文件尾部 | 8字节 | 校验页是否完整 |
对于MyISAM存储引擎表,MySQL数据库只缓存其索引文件,数据文件的缓存交由操作系统本身来完成,这与其他使用LRU算法缓存数据的大部分数据库不一样
LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面给淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间t,当需淘汰一个页面时,选择现有页面中其t值最大的,即最近最少使用的页面给予淘汰
InnoDB存储引擎
innodb只要包含内存池,后台线程,存储文件三部分组成。内存池又是有多个内存块组成的,主要包含缓存磁盘数据、redo log缓冲等;后台线程则包括了Master Thread、IO Thread以及Purge Thread等;由InnoDB存储引擎实现的表存储结构文件一般包括表结构文件(.frm)、共享表空间文件(ibdata1)、独占表空间文件(ibd)以及日志文件(redo 文件等)等。
内存池
客户端读取数据时,如果数据存在于缓冲池中,客户端就会直接读取缓冲池中的数据,否则再去磁盘中读取;对于数据库中的修改数据,首先是修改在缓冲池中的数据,然后再通过 Master Thread 线程刷新到磁盘上。
缓冲池中不仅缓存索引页和数据页,还包括了 undo 页,插入缓存、自适应哈希索引以及 InnoDB 的锁信息等等。
后台线程
Master Thread 主要负责将缓冲池中的数据异步刷新到磁盘中,除此之外还包括插入缓存、undo 页的回收等,IO Thread 是负责读写 IO 的线程,而 Purge Thread 主要用于回收事务已经提交了的 undo log,Pager Cleaner Thread 是新引入的一个用于协助 Master Thread 刷新脏页到磁盘的线程,它可以减轻 Master Thread 的工作压力,减少阻塞。
存储文件
在 MySQL 中建立一张表都会生成一个.frm 文件,该文件是用来保存每个表的元数据信息的,主要包含表结构定义。在 InnoDB 中,存储数据都是按表空间进行存放的,默认为共享表空间,存储的文件即为共享表空间文件(ibdata1)。若设置了参数 innodb_file_per_table 为 1,则会将存储的数据、索引等信息单独存储在一个独占表空间,因此也会产生一个独占表空间文件(ibd)。而日志文件则主要是重做日志文件,主要记录事务产生的重做日志,保证事务的一致性。
InnoDB 逻辑存储结构
InnoDb逻辑存储结构主要包括表空间,段,区,页,行组成。
表空间
表空间共有两种,一种是共享表空间,另一种是独占表空间。 共享表空间为ibdata1。如果设置了参数innodb_file_per_table,则每一张表都有一个独立的物理文件。
段
表空间有段组成,段分为数据段和回滚段。
区
区是表空间的结构单元,大小为1M。
页
页是最小单元,默认大小为16KB。
行
InnoDB 存储引擎是面向行的(row-oriented),也就是说数据是按行进行存放的,每个页存放的行记录也是有硬性定义的,最多允许存放 16KB/2-200 行,即 7992 行记录。
Redo Log
redo log是重做日志,提现再写入操作,实现事务的持久性。undo log是回滚日志,提供回滚操作,保证事务的一致性。
redo log有两部分组成,一部分是缓存的redo log buffer,另一部分是保存到文件中的redo log file。
3.redis数据库
缓存就是数据交换的缓存区(cache)当浏览器执行请求时,首先先在缓存中进行查找,如果存在就获取,否则访问数据库
redis数据库就是一种缓存数据库,用于存储使用频繁的数据,减少访问数据库的次数,提高运行效率。一般redis会把数据写进内存,根据LRU算法进行内存数据淘汰,然后持久化
4.MySQL和Redis总结
-
类型不同
MySQL关系型数据库,Redis非关系型数据库
-
作用不同
MySQL用于持久化的存储数据到硬盘上,而且是精确存储,不容易发生数据丢失,但是因为I/O操作读取,所有读取速度慢
Redis用于存储使用比较频繁的数据到缓存中,读取速度快
-
数据存放位置
MySQL将数据存放在磁盘,Redis将数据存放在内存中
5.数据为什么不直接全部用Redis存储?
Redis其实也是有持久化操作的,既可以用来做持久化存储,也可以做缓存,但是Redis的持久化方法rdb(以二进制数据方法存储数据快照)或者aof(保存用户的操作指令),但是rdb/aof无论怎么进行数据恢复,都会有数据丢失的可能,所以实现有精度的存储可以采用其他数据库,一般两种持久化方法都是一起使用,保证redis故障后能够正常恢复。
储数据快照)或者aof(保存用户的操作指令),但是rdb/aof无论怎么进行数据恢复,都会有数据丢失的可能,所以实现有精度的存储可以采用其他数据库,一般两种持久化方法都是一起使用,保证redis故障后能够正常恢复。