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

1.1 数据库与数据库实例

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

  当启动实例时,MySQL数据库会去读配置文件,根据配置文件的参数来启动数据库实例。如果没有配置文件,MySQL会按照编译时的默认参数设置启动实例。在Windows系统中可以通过mysql --help命令来查看MySQL数据库实例运行时,会查找哪些配置文件。
在这里插入图片描述
  当然这与MySQL的安装路径有关,MySQL数据库会读取最后一个配置文件为准。配置文件中有一个参数datadir,该参数指定了数据库所在的路径。

mysql> show variables like 'datadir';
+---------------+--------------------------------------------------+
| Variable_name | Value                                            |
+---------------+--------------------------------------------------+
| datadir       | D:\Program Files (x86)\mysql-5.7.28-winx64\data\ |
+---------------+--------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

1.2 MySQL体系结构

在这里插入图片描述
  MySQL由以下几部分组成:

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

1.3 MySQL存储引擎

1.3.1 InnoDB存储引擎

  从MySQL5.5.8版本开始,InnoDB是默认的存储引擎。InnoDB存储引擎支持事务、行锁设计和支持外键,其设计目标主要面向在线事务处理(OLTP)。InnoDB使用多版本控制(MVCC)来获得高并发性,并且实现了SQL标准的4中隔离级别,默认为REPEATABLE级别。同时,使用一种称为next-key-locking的策略来避免幻读。此外InnoDB存储引擎还提供了插入缓冲、二次写、自适应哈希索引、预读等高性能和高可用的功能。
  对于表中数据的存储,InnoDB存储引擎采用了聚集的方式,因此每张表的存储都是按主键的顺序进行存放。如果没有显式地的在表中定义主键,InnoDB存储引擎会为每行生成一个6字节的ROWID,并以此为主键。

1.3.2 MyISAM存储引擎

  MyISAM存储引擎不支持事务、表锁设计,支持全文索引,主要面向一些OLAP数据库应用。在MySQL 5.5.8版本以前,MyISAM存储引擎是默认的存储引擎。此外,MyISAM存储引擎的与众不同的地方在于,它的缓冲池中只缓存索引文件,而不缓存数据文件。MyISAM存储引擎由MYD和MYI组成,其中MYD用来存放数据文件,MYI用来存放索引文件。

1.3.3 NDB存储引擎

  NDB存储引擎是一个集群是存储引擎,其结构是share nothing的集群架构,因此能提供更高的可用性。NDB的特点是数据全部存放在内存中(从MySQL5.1版本开始,可以将非索引数据存放在磁盘中),因此主键查找的速度极快,并且可以线性的添加NDB数据存储节点,是一个高可用、高性能的集群系统。
  NDB存储引擎的连接操作实在MySQL数据库中完成的,而不是在存储引擎中完成的。这就意味着,复杂的连接操作需要巨大的网络开销,而且查询速度很慢。

1.3.4 Memory存储引擎

  Memory存储引擎非常适合存储临时数据的数据表,以及数据仓库中的维度表,它将表中的数据都存放在内存中,如果数据库重启或发生崩溃,则表中的数据将全部消失。
  虽然Memory存储引擎的速度非常快,但是在使用上还有一些限制。比如只支持表锁,并发性能较差,并且不支持TEXT和BLOB列数据。更重要的是,存储变长字段(varchar)是按照定常字段(char)的方式进行的,因此会浪费内存。
  还有一个容易忽视的地方是,MySQL数据库使用Memory存储引擎作为临时表来存放查询的中间结果集,如果中间结果集大于Memory存储引擎的容量设置,又或者中间结果集中含有TEXT或BLOB列类型字段,则MySQL数据库会把其转换为MyISAM存储引擎而存放到磁盘中。而MyISAM中不缓存数据文件,所以就会造成性能损失。

1.3.5 Archive存储引擎

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

1.3.6 Federated存储引擎

  从字义我们就可以知道,一定和“联邦”有关。Federated存储引擎并不存放数据,而是指向一台远程MySQL数据库服务器上的表。

1.3.7 Maria存储引擎

   Maria存储引擎可以看做MyISAM存储引擎的后续版本,其特点是:支持缓存数据和索引文件,应用了行锁设计,提供了MVCC功能,支持事务和非事务的选项,以及更好的BLOB字符类型的处理性能。

1.4 各个存储引擎之间的比较

在这里插入图片描述
  可以使用SHOW ENGINES;来查看当前MySQL中支持的存储引擎类型。

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

1.5 连接MySQL

  连接MySQL操作是一个连接进程和MySQL数据库实例进行通信,从程序设计的角度来说,本质上是进程通信。那么在操作系统中,进程通信有多种方式,比如:管道、命名管道、命名字、TCP/IP套接字、UNIX域套接字等。

1.5.1 TCP/IP

  TCP/IP本质是一种基于网络的连接请求,一般情况在客户端和服务器端上,因为我暂时没有远程的MySQL服务器,为了演示我使用TCP/IP连接到本机的MySQL上。使用mysql -hlocalhost -u root -p,注意其中地址前的h不能掉了。

mysql -hlocalhost -u root -p
Enter password: ******
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 11
Server version: 8.0.17 MySQL Community Server - GPL

  这里的HOST IP就是localhost。

1.5.2 命名管道和共享内存

  在Windows机器上,如果两个需要通信的进程在同一台服务器上,那么可以使用命名管道,Microsoft SQL Server数据库默认安装后的本地连接也是使用命名管道。不过在MySQL数据库中必须在配置文件中启用--enable-named-pipe选项。
  在MySQL4.1之后的版本中,MySQL还提供了共享内存的连接方式,这是在配置文件中添加--shared-memory来实现,如果想使用共享内存的方式,在连接时,MySQL客户端还必须使用--protocol=memory选项。

1.5.3 UNIX域套接字

  在Linux和UNIX环境下,还可以使用UNIX域套接字。UNIX域套接字不是不中网络协议,所以只能在MySQL客户端和数据库实例在一台服务器上的情况下使用。用户可以在配置文件中指定套接字文件的路径,比如–socket=/tmp/mysql.sock(在Unix或Linux下)。当数据库实例启动的时候,用户可以通过下列命令来进行UNIX域套接字文件的查找:

mysql> show variables like 'socket';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| socket        | MySQL |
+---------------+-------+
1 row in set, 1 warning (0.01 sec)

  知道UNIX域套接字文件的路径之后,可以使用该方式进行连接了,如以下方式(Windows中)

mysql -uroot -phadoop -S MySQL;
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 15
Server version: 8.0.17 MySQL Community Server - GPL

Copyright (c) 2000, 2019, 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 -uroot -phadoop -S MySQL-u代表是用户名,-p代表是密码,-S代表是socket域路径。
`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值