MySQL技术内幕读书笔记(一)——Mysql体系结构和存储引擎
MySQL体系结构和存储引擎
定义数据库和实例
- 数据库:物理操作系统文件或者其他形式文件类型的结合。在MYSQL数据库中,数据库文件可以是frm、MYD、MYI、ibd结尾的文件。当使用NDB引擎时,数据库的文件可能不是操作系统上的文件,而是存放在内存之中的文件,但是定义仍然不变。
- 实例:MYSQL数据库由后台线程以及一个共享内存区组成。共享内存可以被运行的后台线程所共享。需要牢记的是,数据库实例才是真正用于操作数据库文件的。
MYSQL被设计为一个单进程多线程架构的数据库。
# 可以查看当MYSQL数据库实例启动时,会在哪些位置查找配置文件。
mysql --help | grep my.cnf
在配置文件中有一个参数是datadir,改参数指定了数据库所在的路径。在LINUX操作系统下默认是/user/local/mysql/data
,这个默认路径只是一个链接,实际指向/opt/mysql_data
。所以用户必须保证/opt/mysql_data
的用户和权限
MYSQL体系结构
MYSQL由一下几部分组成:
- 连接池组件
- 管理服务和工具组件
- SQL接口组件
- 查询分析器组件
- 优化器组件
- 缓冲组件
- 插件式储存引擎
- 物理文件
需要特别注意的是:存储引擎是基于表的,而不是数据库。
MYSQL存储引擎
存储引擎是MYSQL区别与其他数据库的一个最重要特性。用户可以根据MYSQL预定的存储引擎接口编写自己的存储引擎。若用户对某一种存储引擎的性能或功能不满意。可以通过修改源码来得到想要的特性,这就是开源带给我们的方便与力量。
InnoDB存储引擎
- 支持事务:主要面向在线事务处理(OLTP)应用。特点是
- 行锁设计
- 支持外键
- 支持类似于Oracle的非锁定读,即默认读取操作不会产生锁。
- 数据放在一个逻辑的表空间,这个表空间像黑盒一样由INNODB存储引擎自身进行管理。它可以将每个INNODB存储引擎的表单独存放到一个独立的ibd文件中。
- 通过使用多版本并发控制(MVCC)来获得高并发性
- 实现了SQL标准的四种隔离级别。默认为REPEATABLE级别。使用一种被称为next-keylocking的策略来避免幻读现象的产生。
- 提供插入缓冲、二次写、自适应哈希索引、预读等高性能和高可用功能。
- 表中数据采用聚集的方式存放,因此每场表的储存都是按主键的顺序进行存放,如果没有显式指定主键,则会为每一行生成一个6字节的ROWID,并作为主键。
MyISAM存储引擎
- 不支持事务,支持全文索引,主要面向一些OLAP数据库应用。
- 缓冲池只缓冲索引文件,不缓冲数据文件。
- MYD用来存放数据文件,MYI用来存放索引文件。
NDB存储引擎
- 集群架构:share nothing
- 数据全部放在内存中,因此主键查找的速度极快,并且通过添加NDB数据存储节点可以线性地提高数据库性能,是高可用、高性能的集群系统。
- NDB存储引擎的连接操作是在MYSQL数据库层完成的,而是在存储引擎层完成的。这意味着,复杂的连接操作需要巨大的网络开销
Memory存储引擎
- 数据都存放在内存中,非常适合用于存储临时数据的临时表,以及数据仓库中的维度表。
- 默认使用哈希索引
- 只支持表锁,并发性能较差,不支持TEXT和BLOB列类型
- 存储变长字段(varchar)时按照定常字段(char)的方式进行的,会浪费内存。
Archive存储引擎
- 只支持INSERT和SELECT操作
- 支持索引
- 使用zlib算法将数据行进行压缩后存储,压缩比一般达1:10
- 适合存储归档数据,例如日志信息等。
- 使用行锁实现高并发的插入操作
- 不支持事务
FEDERATED存储引擎
- 不存放数据,只是指向一台远程MYSQL数据库服务器上的表。这非常类似于SQL SERVER的联结服务器和Oracle的透明网关
- 不支持异构
Maria存储引擎
- 支持魂村数据和索引文件
- 行锁设计,提供了MVCC功能
- 支持事务和非事务安全的选项
- 更好的BLOB字符类型的处理性能。
# 查看数据库锁支持的存储引擎
SHOW ENGINES\G
MySQL技术内幕读书笔记(一)——Mysql体系结构和存储引擎的更多相关文章
- MySQL技术内幕读书笔记(二)——InnoDB存储引擎
目录 InnoDB存储引擎 InnoDB存储架构 Checkpoint技术 Master Thread 工作方式 InnoDB关键特性(放一下,感觉看后面,再看总结吧) InnoDB存储引擎 Inno ...
- MySQL技术内幕读书笔记(八)——事务
事务的实现 事务隔离性由锁来实现.原子性.一致性.持久性通过数据库的redo log和undo log来完成.redo log称为重做日志,用来保证事务的原子性和持久性.undo log用来保证事 ...
- MySQL技术内幕读书笔记(七)——锁
锁 锁是数据库系统区分与文件系统的一个关键特性.为了保证数据一致性,必须有锁的介入.数据库系统使用锁是为了支持对共享资源进行并发访问,提供数据的完整性和一致性. lock与latch 使用命令 ...
- MySQL技术内幕读书笔记(五)——索引与算法
索引与算法 INNODB存储引擎索引概述 INNODB存储引擎支持以下几种常见的索引: B+树索引 全文索引 哈希索引 InnoDB存储引擎支持的哈希索引是自适应的.会根据表的情况自动添加 ...
- MySQL技术内幕读书笔记(四)——表
目录 表 索引组织表 InnoDB逻辑存储结构 INNODB行记录格式 INNODB数据页结构 约束 视图 分区表 表 表就是关于特定实体的数据集合,是关系型数据库模型的核心. 索引组织表 在 ...
- MySQL技术内幕读书笔记(三)——文件
目录 文件 参数文件 日志文件 套接字文件 pid文件 表结构定义文件 INNODB存储引擎文件 文件 有以下类型文件 参数文件:告诉MYSQL实例启动时在哪里找到数据库文件,并且制定某些初始化参 ...
- MySQL技术内幕读书笔记(六)——索引与算法之全文索引
全文索引 概述 通过索引字段的前缀进行查找,B+树索引是支持的,利用B+树索引就可以进行快速查询. SELECT * FROM blog WHERE content like 'xxx%'; ...
- Struts2技术内幕 读书笔记一 框架的本质
本读书笔记系列,主要针对陆舟所著<<Struts2技术内幕 深入解析Strtus2架构设计与实现原理>>一书.笔记中所用的图片若无特殊说明,就都取自书中,特此声明. 什么是框架 ...
- Struts2技术内幕 读书笔记三 表示层的困惑
表示层能有什么疑惑?很简单,我们暂时忘记所有的框架,就写一个注册的servlet来看看. index.jsp <form id="form1" name="form ...
随机推荐
- jupyter notebook不能选择虚拟环境的解决方法
今天使用dlib没有py37版本,因此创建了Version_36虚拟环境.但jupyter notebook默认的内核找不到新建的虚拟环境,解决方法是需要安装两个包: × ipykernel × nb ...
- c/c++关于指针的一点理解
#include <iostream> #include <string> using namespace std; int main() { }, n{}; cout < ...
- Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
- SpringMVC(二五) JSTL View
项目中使用JSTL,SpringMVC会把视图由InternalView转换为JstlView. 若使用Jstl的fmt标签,需要在SpringMVC的配置文件中配置国际化资源文件. 实现过程: 1. ...
- 在eclipse中配置Python环境
1.下载pydev https://sourceforge.net/projects/pydev/files/pydev/PyDev%202.2.2/ 2.解压pydev插件后 有features.p ...
- 翻转长方形 (不知名oj中一道个人私题)--单调栈维护最大子矩形
怎么分析这道题呢? 首先 ,我们注意到一点: 不管怎么操作,任意一个2*2方格中的 "#"个数的奇偶性是不变的. 所以,如果一个2*2方格中有奇数个"#",这个 ...
- SpringBoot扫描不到controller
访问报错: 原因:启动类文件存放位置问题,应该放在controller包同级目录下,如下图: ---不积跬步无以至千里,不积小流无以成江海
- Idea创建一个springboot多模块项目
一.创建空Maven项目 二.左边选择maven,右边可以什么不选,直接next: 三.填写artifactId,点击next直到finish 四.finish后,idea会生成如下结果模块,删除sr ...
- BZOJ3737 : [Pa2013]Euler
首先枚举$n$的每个约数$d$,检查一下$d+1$是否是质数,这些数都有可能作为答案的质因子出现. 考虑爆搜,每次枚举下一个要在答案中出现的质因子$p$,将$n$除以$p-1$,再枚举$p$的指数,然 ...
- python系统编程(四)
进程池Pool 当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到mu ...