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域路径。
`