《MySQL技术内幕:InnoDB存储引擎》(一) - MySQL体系结构和存储引擎

MySQL:单进程多线程数据库。

为后续可以清楚的理解MySQL体系结构中的存储引擎,这里先介绍清楚数据库数据库实例这两个概念

  • 数据库:文件的集合,依照某种数据模型组织起来,并存放于二级存储器(硬盘)中的数据集合
  • 数据库实例:应用程序,位于用户与操作系统之间的一层数据管理软件,用户对数据库数据的任何操作,包括数据库定义、数据查询维护、数据库运行控制等,都是在数据库实例下进行的,应用程序只能通过数据库实例才能和数据库打交道。

简单来说,数据库是由一个个文件组成(一般都是二进制文件),如果要对这些文件执行诸如SELECT、INSERT、UPDATE和DELETE之类的操作,不能通过简单的操作文件来更改数据库的内容,而是需要通过数据库实例来完成对数据库的操作。

数据库实例和数据库,通常是一一对应关系,但在集群情况下,一个数据库可被多个实例使用。

启动实例时,MySQL数据库会去读取配置文件,若没有配置文件,则会按照编译时的默认参数设置启动实例(而在Oracle中,如果没有配置文件,启动时会提示找不到参数文件),可以通过命令查看MySQL实例启动时,会去哪些位置查找配置文件(在MySQL安装目录的bin目录下执行):

[root@mysql bin]# ./mysql --help | grep my.cnf
                      order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf

各配置文件从前往后按顺序读取,若多个配置文件中有同一个参数,会以读取到的最后一个配置文件中的参数为准(即覆盖之前的配置)

datadir参数:指定数据库所在路径。可以通过下面的命令查看数据库所在路径:

mysql> show variables like 'datadir'\G;
*************************** 1. row ***************************
Variable_name: datadir
        Value: /usr/local/mysql/mysql-5.6.40-linux-glibc2.12-x86_64/data/
1 row in set (0.00 sec)

MySQL数据库的体系结构

了解了一些概念,下面介绍一下MySQL数据库的体系结构:(图片来自《MySQL技术内幕:InnoDB存储引擎》)

MySQL由以下几部分组成:

  • 连接池组件
  • 管理服务和工具组件
  • SQL接口组件
  • 查询分析器组件
  • 优化器组件
  • 缓冲(Cache)组件
  • 插件式存储引擎
  • 物理文件

注:插件式体系结构是MySQL独有的,并且存储引擎是MySQL区别于其他数据库的一个最重要特性。存储引擎是基于表的,而不是数据库。

存储引擎的好处:每个存储引擎有各自的特点,可根据不同的应用建立不同的存储引擎表。

InnoDB存储引擎:Windows版本下的默认存储引擎,支持事务,主要面向在线事务处理(OLTP)方面的应用。

支持行锁设计外键以及类似于Oracle的非锁定读,即默认情况下读取操作不会产生锁。

InnoDB存储引擎将数据放在一个逻辑的表空间中,由InnoDB自身进行管理(类似于黑盒)。

  • InnoDB通过使用多版本并发控制(MVCC)来获取高并发性
  • 实现了SQL标准的4种隔离级别(默认为REPEATABLE级别)
  • 使用next-key locking策略避免幻读现象
  • 提供了插入缓冲、二次写、自适应哈希索引、预读等

对于表中数据的存储,InnoDB存储引擎采用了聚集的方式(类似于Oracle的索引聚集表),按主键顺序存放,如未指定主键,则为每行生成一个6字节的ROWID,并以此作为主键。

MySQL表存储引擎

MyISAM存储引擎:除Windows版本外,所有MySQL版本默认的存储引擎。不支持事务、表锁和全文索引。OLAP(在线分析处理)速度快。

MyISAM存储引擎由MYD(存放数据文件)和MYI(存放索引文件)组成。

NDB存储引擎集群存储引擎(类似于Oracle的RAC集群), share nothing的集群结构,数据全部放在内存中(5.1版本后,非索引数据放在磁盘上),主键查找速度极快,通过添加NDB数据存储节点,可以线性的提高数据库性能。

注:NDB存储引擎的连接操作(JOIN)是在MySQL数据库层完成的,而不是在存储引擎层,即复杂的连接操作需要巨大的网络开销,查询速度很慢。

Memory存储引擎:即HEAP存储引擎,将表中的数据放在内存中,适用于存储临时数据的临时表和数据仓库中的纬度表。默认使用哈希索引,而不是B+树索引。

只支持表锁,并发性能差,不支持TEXT和BLOB列类型,存储varchar时是按照char的方式。

注:MySQL数据库使用Memory存储引擎作为临时表来存放查询的中间结果集。如果中间结果集大于Memory存储引擎表的容量设置,或者中间结果含有TEXT或BLOB,则会将其转换到MyISAM存储引擎表而放到磁盘(5.1版本后非索引数据放在磁盘),这时产生的临时表性能对于查询会有损失。

Archieve存储引擎只支持INSERT和SELECT操作,5.1版本开始支持索引。使用zlib算法将数据行进行压缩后存储(压缩比例一般可达1:10),适用于存储归档数据,如日志信息。使用行锁来实现高并发的插入操作,本身非事务安全,设计目标为提供高速的插入和压缩功能

Federated存储引擎:不存放数据,只是指向远程MySQL数据库服务器上的表(类似于SQL Server的链接服务器和Oracle的透明网关),只支持MySQL数据库表。

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

各种存储引擎之间的比较

可通过SHOW ENGINES查看当前使用的MySQL数据库支持的存储引擎,也可以通过information_schema架构下的ENGINES表查看:

mysql> show engines\G;
*************************** 1. row ***************************
      Engine: InnoDB
     Support: DEFAULT
     Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
          XA: YES
  Savepoints: YES
*************************** 2. row ***************************
      Engine: CSV
     Support: YES
     Comment: CSV storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 3. row ***************************
      Engine: MRG_MYISAM
     Support: YES
     Comment: Collection of identical MyISAM tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 4. row ***************************
      Engine: BLACKHOLE
     Support: YES
     Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 5. row ***************************
      Engine: MyISAM
     Support: YES
     Comment: MyISAM storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 6. row ***************************
      Engine: MEMORY
     Support: YES
     Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 7. row ***************************
      Engine: ARCHIVE
     Support: YES
     Comment: Archive storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 8. row ***************************
      Engine: FEDERATED
     Support: NO
     Comment: Federated MySQL storage engine
Transactions: NULL
          XA: NULL
  Savepoints: NULL
*************************** 9. row ***************************
      Engine: PERFORMANCE_SCHEMA
     Support: YES
     Comment: Performance Schema
Transactions: NO
          XA: NO
  Savepoints: NO
9 rows in set (0.00 sec)

MySQL提供实例数据库,但在安装数据库时未提示用户是否安装,因此需自己下载,用MySQL的实例数据库做一个简单例子可显示各存储引擎之间的区别:

连接MySQL

连接MySQL操作是连接进程和MySQL数据库实例进行通信,实质上是进程通信进程通信常用方式有管道、命名管道、命名字、TCP/IP套接字、Unix域名套接字

TCP/IP:如下图:

通过TCP/IP连接到MySQL实例时,MySQL会先检查一张权限视图,用来判断客户端IP是否允许连接到MySQL实例。该视图在mysql库下,表名为user:

mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select host, user, password from user;
+-------------------+------+-------------------------------------------+
| host              | user | password                                  |
+-------------------+------+-------------------------------------------+
| localhost         | root | *D5C139BE655F9C459762CC5D8C6819988C732B94 |
| host-mysql        | root |                                           |
| 127.0.0.1         | root |                                           |
| ::1               | root |                                           |
| localhost         |      |                                           |
| host-mysql        |      |                                           |
| %                 | root | *D5C139BE655F9C459762CC5D8C6819988C732B94 |
+-------------------+------+-------------------------------------------+
7 rows in set (0.00 sec)

命名管道和共享内存

如果需要通信的两个进程在同一台服务器上,可以使用命名管道。MySQL4.1之后,MySQL还提供了共享内存的连接方式,在配置文件中添加--shared-memory。

Unix域套接字

Unix域套接字并非一个网络协议,因此只能在客户端和数据库实例在同一台服务器上时使用,并且只能在Linux和Unix环境下使用。可在配置文件中指定套接字文件的路径,如-socket=/tmp/mysql.sock。

查找Unix域套接字文件:

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

知道Unix域套接字文件路径后,可通过如下方式连接:

[root@mysql bin]# ./mysql -uroot -S /tmp/mysql.sock -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 5.6.40 MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

小结

首先介绍了数据库和数据库实例的含义,然后分析了MySQL的体系结构,还详细讲解了各种常见的存储引擎的特性、适用情况以及彼此之间的区别。

内容来自《MySQL技术内幕:InnoDB存储引擎》

你可能感兴趣的:(mysql,存储引擎)