MySQL技术内幕 InnoDB存储引擎——第1章 MySQL体系结构和存储引擎

第1章 MySQL体系结构和存储引擎

1.1 定义数据库和实例

数据库:

物理操作系统文件或其他形式文件类型的集合。MySQL数据库中,数据库文件可以是frm、MYD、MYI、ibd结尾的文件。当使用NDB引擎时,数据库文件可能不是操作系统上的文件,而是存放于内存之中的文件。

实例:

MySQL数据库由后台线程以及一个共享内存区组成。数据库实例才是真正用于操作数据库文件的。

MySQL是一个单进程多线程架构的数据库,系统上表现的是一个进程。

对应关系:

一个实例对应一个数据库,一个数据库对应一个实例。

集群模式、多例下:可能存在一个数据库被多个实例使用的情况

实战:

启动数据库实例:
./mysqld_safe&
观察进程情况:
ps -ef | grep mysqld

启动实例时,MySQL数据库会读取配置文件,根据配置文件的参数来启动数据库实例。(没有配置文件,MySQL则会按照编译时的默认参数设置启动实例)

查看当MySQL数据库实例启动时,会在哪些位置查找配置文件:
mysql --help | grep my.cnf

几个配置文件同一个参数以读取到的最后一个配置文件的参数为准。

1.2 MySQL体系结构

数据库是由一个个文件组成(通常是二进制文件),对这些文件进行数据库操作(如insert,delete,update,select)需要通过数据库实例来完成对数据库的操作。

1.2.1 MySQL体系结构图:

MySQL体系结构图

1.2.2 MySQL由以下部分组成:

  1. 连接池
  2. 管理服务和工具
  3. SQL接口
  4. 查询分析器
  5. 缓冲(Cache)
  6. 插件式存储引擎:提供了一系列标准的管理和服务支持,这些标准与存储引擎本身无关,可能是每个数据库系统本身必须的,如SQL分析器和优化器,而存储引擎是底层物理结构的实现。
  7. 物理文件

1.3 MySQL存储引擎

存储引擎是MySQL体系结构的核心。

存储引擎是基于表的,而不是数据库。

1.3.1 InnoDB 存储引擎

InnoDB 存储引擎是MySQL数据库最常用的一种引擎。

  1. 支持事务,设计目标主要面向在线事务处理(OLTP)的应用。特点是行锁设计、支持外键,并支持类似Oracle的非锁定锁(即默认读取操作不会产生锁)。5.5.8版本开始,InnoDB存储引擎是默认的存储引擎
  2. 将数据放在一个逻辑的表空间中,表空间由 InnoDB存储引擎自身进行管理。4.1版本(包括4.1)开始,可以将每个单独的表存放到一个独立的ibd文件中。
  3. 通过多版本并发控制(MVCC)来获得高并发性,实现了SQL标准的4种隔离级别,默认为REPEATABLE级别。通过next-key locking的策略来避免幻读。提供插入缓冲、二次写、自适应哈希索引、预读等高性能和高可用功能。
  4. 表中数据存储采用聚集的方式,因此每张表的存储都是按主键的顺序存放。没有显示地在表定义时指定主键,将会为每一行生成6字节的ROWID,并以此作为主键。

1.3.2 MyISAM 存储引擎

  1. 不支持事务、表锁设计,支持全文索引,主要面向OLAP数据库应用。5.5.8之前MyISAM存储引擎是默认的存储引擎(除Windows版本外)。缓冲池只缓存(cache)索引文件,而不缓存数据文件,数据文件的缓存由操作系统本身完成。
  2. 表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件。可用myisampack工具进一步压缩数据文件,压缩后的表是只读的(由于用赫夫曼编码静态算法来压缩数据)。
  3. 5.0版本之前默认支持表大小为4G,需要大于4G,要制定 MAX_ROWS 和 AVG_ROW_LENGTH 属性。5.0版本开始,默认支持256TB的单表数据。

1.3.3 NDB 存储引擎

  1. 是一个集群存储引擎,类似Oracle的RAC集群。特点是数据全部放在内存中(5.1版本开始,可以将非索引数据放在磁盘上),因此主键查找速度极快,并通过添加NDB数据存储节点可以线性地提高数据库性能。
  2. 连接操作(JOIN)是在MySQL数据库层完成的,而不是在存储引擎完成的。意味着,复杂的连接操作需要巨大的网络开销,查询数据很慢。

1.3.4 Memory(HEAP)存储引擎

  1. 将表的数据存放在内存中,如果数据库重启或崩溃,表中数据都将消失。适用于存储临时数据的临时表,以及数据仓库中的维度表。默认使用哈希索引,而不是B+树索引。
  2. 速度快,但有限制。如只支持表锁,并发性能差,不支持TEXT和BLOB列类型。存储变长字段(varchar)时是按照定常字段(char)的方式进行的,因此会浪费内存。
  3. MySQL数据库使用Memory存储引擎作为临时表来存放查询的中间结果集。如果中间结果集大于Memory存储引擎表的容量设置,或中间结果含有TEXT/BLOB列类型字段,则MySQL数据库会把其转换到MyISAM存储引擎表而存放到磁盘中。MyISAM不缓存数据文件,因此产生的临时表的性能对于查询会有损失。

1.3.5 Archive 存储引擎

  1. 只支持insert和select操作,5.1版本开始支持索引。
  2. 使用zlib算法将数据行(row)进行压缩后存储,压缩比(1:10)左右,适合存储归档数据,如日志信息。
  3. 行锁来实现高并发的插入操作,但是本身不是事务安全的存储引擎,主要是为了提供高速的插入和压缩功能。

1.3.6 Federated 存储引擎

表不存放数据,只是指向另一台MySQL数据库服务器上的表。(类似SQL Server的链接服务器和Oracle的透明网关),区别是Federated 存储引擎只支持MySQL数据库表,不支持异构数据库表。

1.3.7 Maria 存储引擎

目的是取代原有MyISAM存储引擎,从而成为默认的存储引擎。特点是:支持缓存数据和索引文件,应用了行锁设计,提供了MVCC功能,支持事务和非事务安全的选项,以及更好的BLOB字符类型的处理性能。

1.3.8 其他存储引擎存储引擎

Merge、CSV、Sphinx和Infobright。

支持全文索引:MyISAM 、InnoDB(1.2版本)和Sphinx存储引擎都支持。

1.4 各存储引擎之间的比较

不同MySQL存储引擎相关特性比较:

不同MySQL存储引擎相关特性比较

实战:
查看当前使用的MySQL数据库所支持的存储引擎:SHOW ENGINES

查找information_schema架构下的ENGINES表

1.SHOW ENGINES\G
2.information_schema

MySQL提供了一个用来演示MySQL各项功能的示例数据库。下载示例数据库

1.5 连接MySQL

连接MySQL操作是一个连接进程和MySQL数据库实例进行通信。本质上是进程通信。

常用的进程通信方式有管道、命名管道、命名字、TCP/IP套接字、UNIX域套接字。

1.5.1 TCP/IP

客户端和MySQL实例在不同服务器上。

MySQL数据库在任何平台下都提供的连接方式。

在TCP/IP连接上建立一个基于网络的连接请求,通常**客户端(client)**在一台服务器上,MySQL实例(server)在另一台服务器上,这两台服务器通过TCP/IP网络连接。连接成功后就可以对MySQL数据库进行数据库操作,如DDL和DML等。

通过TCP/IP连接到MySQL实例时,MySQL数据库会先检查一张权限视图,用来判断发起请求的客户端IP是否允许连接到MySQL实例。该视图在mysql架构上,表名为user。

USE mysql
SELECT host,user,password from user;

用户权限表下,david用户在任何IP段下连接该实例,并且不需要密码。

1.5.2 命名管道和共享内存

命名管道:

两个需要进程通信的进程在同一台服务器上

在Windows 2000、Windows XP、Windows 2003 和 Windows Vista以及在此之上的平台上,如果两个需要进程通信的进程在同一台服务器上,那么可以使用命名管道,SQL Server数据库默认安装后的本地连接也是使用命名管道。

MySQL数据库需在配置文件启用–enable-named-pipe选项。

共享内存:

在4.1之后的版本,提供共享内存的连接方式。

配置文件中添加:–shared-memory

连接时MySQL客户端还必须使用:–protocol=memory选项

1.5.3 UNIX域套接字

Linux和UNIX环境下。

UNIX域套接字不是网络协议,所以只能在MySQL客户端和数据库实例在一台服务器上的情况下使用

用户可以通过配置文件指定套接字文件的路径如–socket=/tmp/mysql.sock。

1.当数据库实例启动后,用户可以通过下列命令来进行UNIX域套接字文件的查找:

SHOW VARIABLES LIKE 'socket';
将会返回UNIX域套接字文件的路径,如/tmp/mysql.sock

2.连接:

mysql -udavid -S /tmp/mysql.sock

-udavid:用户权限表下,david用户在任何IP段下连接该实例,并且不需要密码。

1.6 小结

数据库和数据库实例的定义->MySQL数据库体系结构->“实例”和”数据库“的区别

各种常见表存储引擎的特性、适用情况,以及区别。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值