MySQL技术内幕InnoDB存储引擎学习笔记(第一章)
第一章 MySQL体系结构和存储引擎一、实验环境宿主机系统:windows7虚拟机:OracleVMVirtualBoxLinux:ubuntukylin-14.04.1-amd64.isojdk:1.7.0_101mysql:5.7.12二、MySQL是什么MySQL是一个可移植的数据库,几乎在当前所有系统上都能运行。虽各平台在底层实现方面都各不相同,但是MySQ
第一章 MySQL体系结构和存储引擎
一、实验环境
宿主机系统:windows7
虚拟机:OracleVMVirtualBox
Linux:ubuntukylin-14.04.1-amd64.iso
jdk:1.7.0_101
mysql:5.7.12
书上的mysql版本:5.6.6
二、MySQL是什么
MySQL是一个可移植的数据库,几乎在当前所有系统上都能运行。虽各平台在底层实现方面都各不相同,但是MySQL基本上能保证在各平台上的物理体系结构的一致性。
MySQL是一个单进程多线程架构的数据库。
二、几个术语
数据库(database):物理操作系统文件或其他形式文件的集合;是依照某种数据模型组织起来并存放于二级存储器中的数据集合。通常表现为:frm、MYD、MYI、ibd结尾的文件。
实例(instance):MySQL数据库由后台线程及一个共享内存区组成。共享内存可以被运行的后台线程所共享。数据库实例是真正用于操作数据库文件的。
通俗理解:
实例:程序,是位于用户与操作系统之间的一层数据管理软件,用户对与数据库数据的任何操作(增删改查),都是在数据库实例下进行的,应用程序只有通过数据库实例才能和数据库打交道。
数据库:由一个个文件组成(一般来说都是二进制文件),要对这些文件进行增删改查,则需要通过数据库实例来完成。
关系:MySQL数据库中,实例和数据库的关系通常是一一对应的,即一个实例对应一个数据库。集群情况下,可能存在一个数据库被多个实例使用的情况。
MySQL数据库实例在系统上的表现为:一个进程。
三、Linux下MySQL的使用
1.启动服务(书):./mysqld_safe
我自己用的:
./etc/init.d/mysql start
sudo service mysql start
2.查看进程:ps -ef | grep mysqld
当启动实例时,MySQL数据库会读取配置文件,根据配置文件的参数来启动数据库实例。如果没有配置文件,则会按照编译时默认参数设置来启动实例。(与oracle的区别,oracle如没有配置文件,会报启动失败)。
3.查看实例启动时会在哪些位置查找配置文件:mysql --help | grep my.cnf
如图:查找的位置分别为:/etc/my.cnf ; /etc/mysql/my.cnf ; ~/.my.cnf
如多个配置文件中都有同一个参数,则以读取到的最后一个配置文件的参数为准。默认情况下文件在/etc/mysql/my.cnf。查看默认配置如下,软件采用apt-get的方式安装。安装过程见:http://blog.csdn.net/lanonola/article/details/51423249
四、MySQL体系结构
由图可见:mysql由以下组成
Connection Pool:连接池组件,管理缓冲用户连接,线程处理等需要缓存的需求
Management Serveices &Utilities:管理服务和工具组件
SQL Interface:SQL接口组件,接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface。
Parser:查询分析器组件SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。
主要功能:
a . 将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的 。
b. 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的
Optimizer:优化器组件,QL语句在查询之前会使用查询优化器对查询进行优化。他使用的是“选取-投影-联接”策略进行查询。用一个例子就可以理解: select uid,name fromuser where gender = 1;这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤。这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤,将这两个查询条件联接起来生成最终查询结果
Cache和Buffer:缓冲组件,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等
Engine:插件式存储引擎,存储引擎是MySql中具体的与文件打交道的子系统。也是Mysql最具有特色的一个地方。Mysql的存储引擎是插件式的。它根据MySql AB公司提供的文件访问层的一个抽象接口来定制一种文件访问机制(这种访问机制就叫存储引擎)。MySQL插件式的存储引擎架构提供了一系列标准的管理和服务支持,这些标准和存储引擎本书无关。注意:存储引擎是基于表的,而不是基于数据库
物理文件:不展开。
五、MYSQL存储引擎
好处:每个存储引擎都有各自的特点,能够根据具体的应用建立不同存储引擎表。
InnoDB
1.从mysql5.5.8开始,InnoDB是默认的存储引擎。
2.设计目标:面向在线事物处理(OLTP)
3.特点:行锁设计,支持外键,支持非锁定读。即默认读取操作不会产生锁。
InnoDB把数据放在一个逻辑的表空间中,这个表空间像黑盒一样由InnoDB进行管理。可以将每个InnoDB存储引擎的表单独存放到一个独立的ibd文件中。支持用裸设备(row disk)来建立其表空间。通过多版本并发控制来获得高并发性。实现了SQL标准的4中隔离级别,默认为REPEATABLE级别。对表中数据的存储,采用了聚集的方式。因此,每张表的存储都是按照主键的顺序进行存放。如果没有显式的在表定义中指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并以此作为主键。
MyISAM存储引擎
不支持事务、表锁设计,支持全文索引,主要面向一些OLAP数据库应用。5.5.8之前,mysql的默认存储引擎。另外,它的缓冲池只缓冲索引文件,而不缓冲数据文件。MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件。
NDB存储引擎
集群存储引擎,其结构是share nothing的集群机构,因此能提供更高的可用性。特点是数据全部放在内存中,5.1开始,可以将非索引数据放在磁盘上,因此主键查找的速度极快,并通过添加NDB数据存储节点可以线性的提高数据库性能,是高可用,高性能的集群系统。
NDB存储引擎的链接操作(JOIN)是在mysql数据库层完成的,而不是在存储引擎层完成的。这意味着复杂的链接操作需要巨大的网络开销,因此查询速度很慢。
Memory存储引擎
将表中数据存放在内存中,如果数据库重启或发生奔溃,表中数据都将消失。适合存数据临时表及数据仓库中的纬度表。默认使用哈希索引,而不是B+树索引。只支持表锁,并发性能较差,不支持TEXT和BLOB列类型。存储变长(varchar)字段时是按照定长(char)字段的方式进行的,浪费内存。
Archive存储引擎
只支持insert和select操作,5.1以后支持索引。使用zlib算法将数据行进行压缩后存储,压缩比可达1:10。适合存储归档数据,如日志信息。使用行锁来实现高并发的插入操作,但是其本身不是事务安全的存储引擎,设计目标主要是提供高速的插入和压缩功能。
Federated存储引擎
不存放数据,只是指向一台远程mysql数据库服务器上的表。只支持mysql数据库表,不支持异构数据库表。
Maria存储引擎
新开发的引擎,主要是用来取代原有的MyISAM存储引擎,从而成为MySQL的默认存储引擎。支持缓存数据和索引文件,应用了行锁设计,提供了MVCC功能,支持事务和非事务安全的选项,以及更好的BLOB字符类型的处理性能。
其他存储引擎:不展开
show engines:查看当前mysql所支持的存储引擎。
通过查找information_schema架构下的engines表查看当前mysql所支持的存储引擎。
create table mytest Engine=MyISAM;
create table mytest Engine=InnoDB;
create table mytest Engine=ARCHIVE;
六、连接MySQL
一个连接进程和MySQL数据库实例进行通信。本质上是进程通信。
TCP/IP:我们平时所用的方式。通过TCP/IP连接到MySQL实例时,MySQL数据库会先检查一张权限视图,用来判断发起请求的客户端IP是否允许连接到MySQL实例。该视图在mysql架构下,表名为user.
命名管道和共享内存:
如果两个需要进程通信的进程在同一台服务器上,那么可以适用命名管道,在配置文件中启用--enable-named-pipe选项。
共享内存的连接方式:通过在配置文件中添加--shared-memory实现。如果想使用共享内存的方式,在连接时,MySQL客户端还必须使用--protocol=memory选项。
UNIX域套接字:Linux或UNIX环境下,mysql客户端和数据库实例在一台服务器上的情况下可以使用。用户可以在配置文件中指定套接字文件的路径,如--socket=/tmp/mysql.sock.当数据库实例启动后,用户可以通过下列命令来进行UNIX域套接字文件的查找:
mysql > SHOW VARTABLES LIKE 'socket';
感觉这种连接方式不会常用的。简单记录下。
以上,第一章完。更多推荐
所有评论(0)