MySql体系结构和存储引擎

一、数据库和数据库实例

数据库是文件的集合,是依照某种数据模型组织起来并存放于二级存储器中的数据集合;

数据库实例是程序,是位于用户与操作系统之间的一层数据库管理软件,用户对数据库数据的任何操作,包括数据库定义、数据查询、数据维护、数据库运行控制等都是在数据库实例下进行的,应用程序只有通过数据库实例才能和数据库打交道。

1、MySql被设计为一个单进程多线程的数据库,MySql数据库实例在系统上的表现就是一个进程。

root@TryHard:~# ps -ef | grep mysqld
mysql     1015     1  0  2016 ?        00:48:00 /usr/sbin/mysqld

可以看到MySql数据库服务器进程的进程号是1015。

2、启动数据库的时候,MySql会读取配置文件,它会根据配置文件的参数来启动数据库。在MySql数据库中,可以没有配置文件参数,在这种情况下,MySql会按照编译时的默认参数设置启动实例。

下面是查看MySql数据库实例启动时,会在哪些位置查找配置文件,以及读取配置文件的顺序。

root@TryHard:~# mysql --help

在上面命令的输出中会有下面两行输出。

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf 

可以看出MySql启动时会读取的配置文件以及读取配置文件的顺序。

3、配置文件中有一个参数是datadir,该参数指定了数据库在磁盘中将数据所存储的目录。

这里写图片描述

二、MySql体系结构

下面是MySql的结构图:
这里写图片描述

从图中可以看到MySql主要由以下几部分组成:
1、连接池组件
2、管理服务和工具组件
3、SQL接口组件
4、查询分析器组件
5、优化器组件
6、缓冲(Cache)组件
7、插件式存储引擎
8、物理文件

MySql数据库区别于其它数据库的最重要的一个特点就是其插件式的表存储引擎。MySql插件式的存储引擎架构提供了一系列标准的管理和服务支持,这些标准与存储引擎本身无关,可能是每个数据库系统本身都必需的,如Sql分析器和优化器等。
存储引擎是基于表的,而不是数据库。

1、InnoDB存储引擎
InnoDB存储引擎支持事务,其设计目标主要面向在线事务处理(OLTP)的应用。其特点是行锁设计、支持外键,并支持类似于Oracle的非锁定读,即默认读取操作不会产生锁。5.5.8版本开始,InnoDB存储引擎是默认的存储引擎。

InnoDB存储引擎将数据放在一个逻辑的表空间中,这个表空间就像黑盒子一样由InnoDB存储引擎自身进行管理。
从MySql4.1版本开始,它可以将每个InnoDB存储引擎的表单独存放在一个独立的ibd文件中。
InnoDB存储引擎通过使用多版本并发控制来获得高并发性,并且实现了SQL标准的4中隔离级别,默认是repeatable级别。
同时,InnoDB存储引擎使用一种被称为next-key locking的策略来避免幻读现象的产生。
InnoDB存储引擎还提供了插入缓冲、二次写、自适应哈希索引、预读等高性能和高可用的功能。
对于表中数据的存储,InnoDB存储引擎采用了聚集的方式,因此每张表的存储都是按照主键的顺序进程存放。如果没有显式地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并以此作为主键。

2、MyISAM存储引擎
MyISAM存储引擎不支持事务、表锁设计,支持全文索引,主要面向一些OLAP数据库应用。
MyISAM存储引擎另一个与众不同的地方是它的缓冲池只缓存索引文件,而不缓冲数据文件。数据文件的缓存交给操作系统本身来完成。在5.1.23版本之后,64位的操作系统可以支持大于4GB的索引缓冲区。

MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件。

3、NDB存储引擎
NDB存储引擎是一个集群存储引擎,NDB存储引擎的特点是数据全部放在内存中,因此主键查找的速度非常快。
NDB存储引擎的连接操作(join)是在MySql数据库层完成的,而不是在存储引擎层完成的。这意味着,复杂的连接操作需要巨大的网络开销,因此查询速度很慢。

4、Memory存储引擎
Memory存储引擎将表中的数据存放在内存中,如果数据库重启或发生崩溃,表中的数据都将消失。它适合用于存储临时数据的临时表,以及数据仓库中的纬度表。
Memory存储引擎默认使用哈希索引,而不是B+树索引。
虽然Memory存储引擎速度快,但是它支持表锁,并发性能较差,并且不支持TEXT和BLOB列类型。最重要的是,存储变长字段时是按照定常字段的方式进行的,因此会浪费内存。

5、Archive存储引擎
Archive存储引擎只支持insert和select操作,从5.1版本开始支持索引。Archive存储引擎使用zlib算法将数据行进行压缩后存储,压缩比一般可达1:10。
Archive存储引擎非常适合存储归档数据,如日志信息。
Archive存储引擎使用行锁来实现高并发的插入操作,但是其本身并不是事务安全的存储引擎,其设计目标主要是提供高速的插入和压缩功能。

6、Federated存储引擎
Federated存储引擎并不存放数据,它只是指向一台远程MySql数据库服务器上的表。

7、Maria存储引擎
Maria存储引擎是新开发的引擎,设计目标主要是用来取代原有得到MyISAM存储引擎。
Maria存储引擎的主要特点是:支持缓存数据和索引文件,应用了行锁设计,提供了MVCC功能,支持事务和非事务安全的选项,以及更好的BLOB字符类型的处理性能 。

8、其它存储引擎
MySql还支持的存储引擎包括Merge,CSV,Sphinx和Infobright。

三、MySql的问题

1、MySql数据库支持全文索引吗?
支持。MyISAM、InnoDB和Sphinx存储引擎都支持全文索引。
2、当表的数据量大于1000万时MySql的性能会急剧下降吗?
不会。因为MySql是数据库,不是文件,随着数据行数的增加,性能当然会有所下降,但是这些下降不是线性的。如果用户选择了正确的存储引擎,以及正确的配置,再多的数据量MySql也能承受。

四、各存储引擎之间的比较

这里写图片描述

可以通过show engines语句查看当前使用的MySql支持的存储引擎,也可以通过查找information_schema数据库下的engines表。

这里写图片描述

五、连接MySql

连接MySql数据库的操作其实是一个连接进程和MySql数据库实例进行通信。
从程序设计的角度来说,本质上是进程通信。进程通信方式主要有:管道,命令管道,命名字,TCP/IP套接字,UNIX域套接字。

1、TCP/IP
TCP/IP套接字方式是MySql数据库在任何平台下都提供的连接方式,也是网络中使用的最多的一种方式。这种方式在TCP/IP连接上建立一个基于网络的连接请求,一般客户端在一台主机上,而MySql数据库实例在另一台主机上。

#mysql -h 192.168.0.1 -u xxx -p
Enter password:

在通过TCP/IP连接到MySql实例时,MySql数据库会先检查一张权限视图,用来判断发起请求的客户端IP是否允许连接到MySql数据库实例。
在数据库mysql中的user表中记录着这些用户。

这里写图片描述

2、命名管道和共享内存
如果两个需要通信的进程在同一台主机上,那么可以使用命名管道。
在MySql数据库中需要在配置文件中启用–enable-named-pipe选项。
在4.1之后的版本中,还提供了共享内存的连接方式,这是通过在配置文件中添加–shared-memory实现的。如果想使用共享内存的方式,在连接时,MySql客户端还必须使用–protocol=memory选项。

3、UNIX域套接字
在Linux和Unix下,还可以使用UNIX域套接字。
UNIX域套接字其实不是网络协议,只有当客户端和数据库实例在同个主机上时,才可以使用。
用户可以在配置文件中指定套接字文件的路径,如–socket=/tmp/mysql.sock。
用户可以通过下面的命令查找UNIX域套接字文件的位置:

mysql> show variables like 'socket';
+---------------+-----------------------------+
| Variable_name | Value                       |
+---------------+-----------------------------+
| socket        | /var/run/mysqld/mysqld.sock |
+---------------+-----------------------------+
1 row in set (0.00 sec)

然后可以通过下面的方式连接数据库服务器:

root@TryHard:~# mysql -u root -S /var/run/mysqld/mysqld.sock -p
Enter password: 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值