MySQL技术内幕 InnoDB存储引擎【一】
MySQL体系结构和存储引擎
1、数据库、实例的概念
数据库:物理操作系统文件或其它形式文件类型的集合
实例:MySQL数据库由后台线程以及一个共享内存区组成。共享内存区可以被运行的后台线程所共享。数据库实例才是真正用于操作数据库文件的。
在MySQL数据库中,实例与数据库的关系通常是一一对应的,即一个实例对应一个数据库,一个数据库对应一个实例。但是,在集群情况下可能存在一个数据库被多个数据实例使用的情况。
MySQL被设计为一个但进程多线程架构的数据库,MySQL数据库实例在系统上的表现就是一个进程。
./mysqld_safe& 启动mysql数据库实例
ps -ef | grep mysqld 查看数据库启动后的进程情况
当启动实例时,MySQL数据库会去读取配置文件,根据配置文件的参数来启动数据库实例,在mysql数据库中,可以没有配置文件,这种情况下,mysql会按照编译时的默认参数设置启动实例。
mysql --help | grep my.cnf mysql数据库实例启动时,会在哪些位置查找配置文件。【如果几个配置文件有相同的参数,以读取到的最后一个配置文件的参数为准】
配置文件中有一个参数datadir,该参数指定了数据库所在的路径。Linux下默认datadir为 /usr/local/mysql/data
2、MySQL体系结构
MySQL由以上几部分组成
# 连接池组件
# 管理服务和工具组件
# SQL接口组件
# 查询分析器组件
# 优化器组件
# 缓冲(Cache)组件
# 插件式存储引擎
# 物理文件
MySQL数据库区别于其它数据库的最重要的一个特点就是其插件式的存储引擎,需要注意的是,存储引擎是基于表的,而不是数据库。
下面是中文图示
3、MySQL存储引擎
存储引擎可以分为MySQL官方存储引擎和第三方存储引擎
InnoDB存储引擎:支持事务,其设计目标主要面向在线事物处理(OLTP)的应用。支持行锁设计、支持外键,从5.5.8以后,是默认的存储引擎。
MyISAM存储引擎:不支持事务、表锁设计,支持全文索引,主要面向一些OLAP数据库应用5.5.8以前,是默认的存储引擎(windows版本除外)。
NDB存储引擎:是一个集群存储引擎,其结构是share noting的集群架构,因此能提供更高的可用性。NDB的特点是数据全部放在内存中(5.5.1开始,可以将非索引数据放在磁盘上),因此主键查找的速度极快,并且通过添加NDB数据存储节点(Data Node)可以线性的提高数据库性能,是高可用、高性能的集群系统。
Memory存储引擎:将表中的数据存放在内存中,如果数据库重启或发生崩溃,表中的数据都将消失。它非常适用于存储临时数据的临时表以及数据仓库中的纬度表。默认使用哈希索引,非B+树索引。
Archive存储引擎:只支持INSERT和SELECT操作,5.1开始支持索引,使用zlib算法将数据行(row)进行压缩后存储,压缩比可达1:10,非常适合存储归档数据,如日志信息。
Federated存储引擎:不存放数据,只是指向一台远程MySQL数据库服务器上的表。
Maria存储引擎:新开发的存储引擎,设计目标主要是用来替代MyISAM存储引擎。
除了上面提到的存储引擎,还有很多存储引擎,他们都有各自的使用场景。
# MySQL数据库支持全文索引,MyISAM, InnoDB和Sphinx存储引擎都支持。
show engines; 查看当前使用的mysql数据库所支持的存储引擎。也可以通过查找information_schema架构下的engines表。
create table mytest Engine = MyISAM; 创建mytest表,存储引擎为MyISAM
alter table mytest Engine = InnoDB; 更改mytest表的存储引擎为InnoDB
使用不同的存储引擎,表的大小也不相同,通过表的大小,简单说明了各存储引擎之间的不同
4、连接MySQL
连接MySQL的操作是一个连接进程和MySQL数据库实例进行通信。从程序设计的角度来说,本质上是进程通信,常用的进程通信方式有管道、命名管道、命名字、TCP/IP套接字、UNIX域套接字。
# TCP/IP
TCP/IP套接字方式是MySQL数据库在任何平台下都提供的连接方式,也是网络中使用的最多的一种方式。一般情况下客户端(client)和MySQL实例(server)不在同一台机器上,通过TCP/IP网络连接。
例如:mysql -h192.168.0.18 -u xs -p
Enter password:
msql>
在通过TCP/IP连接到MySQL实例时,MySQL数据库会先检查一张权限视图,用来判断发起请求的客户端ip是否允许连接到MySQL实例。
msql>USE mysql;
msql>select host,user,password from user;
host显示%,表示任何ip都可以连接。
# 命名管道和共享内存
如果两个需要进程通信的进程在同一台服务器上,那么可以使用命名管道。
# UNIX域套接字
在linux和unix环境下,可以使用UNIX套接字,UNIX域不是一个网络协议,所以只能在MySQL客户端和数据库实例在一台服务器上的情况下使用。当数据库实例启动后,用户可以通过下列命令进行UNIX域套接字文件查找
show variables like 'socket';
知道了UNIX域套接字文件的路径后,就可以使用该方式进行连接
mysql -u lxs -S /tmp/mysql.sock
连接成功 mysql>
准备看一下这本书,顺便做一下记录,刚开始写,慢慢的也提高一下写博客的水平。有看过这本书的可以交流一下