mysql程序架构和存储引擎

mysql服务端的程序架构与存储引擎介绍

mysql程序架构

image-20200922101120470

连接器

各种编程语言的编程接口

连接池

负责认证,并发连接数管理,内存检查,缓存等

sql接口

sql语句的解析、执行、优化、缓存、缓冲等

插件式存储引擎

mysql一大特点:支持可插拔的存储引擎,根据不同的业务需要,可以根据安全性、效率、等因素选择不同的存储引擎,常用的是myisam、innodb、现在mariadb和mysql的默认存储引擎都是innodb,类mysql数据库的各种特性,如事务,都是由存储引擎实现的!

文件系统

关系型数据库管理系统RDMS,是对文件系统做的进一步抽象封装,因此数据库各种对象:表,库,函数,索引等,都表现为文件系统的文件,只是需要rdms才能识别而已;

[root@host2 mysql]# ll /data/mysql/
drwx------ 2 mysql mysql       52 Sep 21 18:45 db1
drwx------ 2 mysql mysql     4096 Sep 18 14:42 mysql
drwx------ 2 mysql mysql       20 Sep 18 14:42 performance_schema

[root@host2 mysql]# ll /data/mysql/db1/
total 104
-rw-rw---- 1 mysql mysql    61 Sep 21 18:35 db.opt
-rw-rw---- 1 mysql mysql  1027 Sep 21 18:45 stu1.frm
-rw-rw---- 1 mysql mysql 98304 Sep 21 18:45 stu1.ibd

# 如mysql的各个库都表现为文件系统上,mysql数据根目录下的,一个目录
# 库中的表,也根据存储引擎的不同,表现为不同类型的文件,总之都是文件系统上的文件!

数据文件

mysql中各个表都表现为文件系统上的文件,数据文件也分多种,实际数据文件、索引数据文件等

日志文件

mysql有各种日志,慢日志,二进制日志,错误日志,redo和undo日志等,也表现为文件系统上的文件

存储引擎

https://mariadb.com/kb/en/storage-engines/

mysql一大特点:支持可插拔的存储引擎,根据不同的业务需要,可以根据安全性、效率、等因素选择不同的存储引擎,常用的是myisam、innodb、现在mariadb和mysql的默认存储引擎都是innodb,类mysql数据库的各种特性,如事务,都是由存储引擎实现的!

存储引擎比较

https://en.wikipedia.org/wiki/Comparison_of_MySQL_database_engines

image-20200922140759437

myIsam

特点:

  • 不支持事务
  • 表级锁
  • 读写相互阻塞
  • 不支持mvcc多版本并发控制机制
  • mysql5.5.5前默认的数据库引擎
  • 速度很快

适合:

  • 只读场景
  • 表较少
[root@host2 ~]# ll /data/mysql/mysql/user.*
-rw-rw---- 1 mysql mysql 3191 Sep 18 14:42 /data/mysql/mysql/user.frm
-rw-rw---- 1 mysql mysql  852 Sep 21 19:43 /data/mysql/mysql/user.MYD
-rw-rw---- 1 mysql mysql 4096 Sep 21 19:45 /data/mysql/mysql/user.MYI
# mysql库还是myisam的存储引擎
# 一个表3个文件,分别是表格式文件、数据文件、索引文件

MariaDB [(none)]> show create table mysql.user;
...
 ENGINE=MyISAM DEFAULT CHARSET=utf8
 # 表定义也可查看表用的存储引擎;

innodb

innodb支持的系统变量列表:https://mariadb.com/kb/en/innodb-system-variables/#innodb_file_per_table

特点:

  • 行级锁
  • 支持事务,适合大量短事务场景
  • 读写阻塞,4种事务隔离等级
  • 支持mvcc
  • crash recover崩溃恢复性好
  • mysql5.5.5后的默认引擎

[root@host2 ~]# ll /data/mysql/db1/
total 104
-rw-rw---- 1 mysql mysql    61 Sep 21 18:35 db.opt
-rw-rw---- 1 mysql mysql  1027 Sep 21 18:45 stu1.frm
-rw-rw---- 1 mysql mysql 98304 Sep 21 18:45 stu1.ibd

# 默认情况:
ibddata1 ibddata2...所有表的数据索引文件都放在一个文件表空间文件中;

# 启用每个表单独一个表空间文件选项:
innodb_file_per_table=on启用后,
frm为表格式定义文件
ibd为数据、索引存储文件

管理存储引擎

# 查看支持的存储引擎
MariaDB [(none)]> show engines;


# 查看当前存储引擎
MariaDB [(none)]> show variables like 'storage_engine%';
+----------------+--------+
| Variable_name  | Value  |
+----------------+--------+
| storage_engine | InnoDB |
+----------------+--------+
1 row in set (0.00 sec)

# 修改存储引擎
[mysqld]
default_storage_engine=MYISAM
[root@host2 ~]# service mysqld restart
MariaDB [(none)]> show variables like 'storage_engine%';
+----------------+--------+
| Variable_name  | Value  |
+----------------+--------+
| storage_engine | MyISAM |
+----------------+--------+

查看某库中所有表的存储引擎

MariaDB [(none)]> show table status from mysql;


查看某表的存储引擎

MariaDB [mysql]> show table status like 'user';

MariaDB [mysql]> show create table mysql.user;

创建表并指定存储引擎

MariaDB [db1]> create table tb1(id int not null primary key) engine=myisam;
Query OK, 0 rows affected (0.00 sec)

修改表的存储引擎

MariaDB [db1]> alter table tb1 engine=innodb;

# 可看到对应数据文件格式变为了innodb文件格式
[root@host2 ~]# ll /data/mysql/db1/
total 112
-rw-rw---- 1 mysql mysql    61 Sep 21 18:35 db.opt
-rw-rw---- 1 mysql mysql  1027 Sep 21 18:45 stu1.frm
-rw-rw---- 1 mysql mysql 98304 Sep 21 18:45 stu1.ibd
-rw-rw---- 1 mysql mysql   922 Sep 22 14:46 tb1.frm
-rw-rw---- 1 mysql mysql     0 Sep 22 14:46 tb1.MYD
-rw-rw---- 1 mysql mysql  1024 Sep 22 14:46 tb1.MYI
[root@host2 ~]# ll /data/mysql/db1/
total 204
-rw-rw---- 1 mysql mysql    61 Sep 21 18:35 db.opt
-rw-rw---- 1 mysql mysql  1027 Sep 21 18:45 stu1.frm
-rw-rw---- 1 mysql mysql 98304 Sep 21 18:45 stu1.ibd
-rw-rw---- 1 mysql mysql   922 Sep 22 14:48 tb1.frm
-rw-rw---- 1 mysql mysql 98304 Sep 22 14:48 tb1.ibd

mysql默认库及作用

mysql

mysql的元数据,存储了用户,权限等元数据信息,一般读较多,写较少,默认myisam引擎

performance_schema

存储了mysql的性能参数,

MariaDB [db1]> use performance_schema;
Database changed
MariaDB [performance_schema]> show tables;
+----------------------------------------------------+
| Tables_in_performance_schema                       |
+----------------------------------------------------+
| accounts                                           |
| cond_instances                                     |
| events_stages_current                              |

information_schema

基于内存的,不存储于磁盘的文件系统,提供了访问数据库元数据的方式;

MariaDB [performance_schema]> use information_schema
Database changed
MariaDB [information_schema]> show tables;
+---------------------------------------+
| Tables_in_information_schema          |
+---------------------------------------+
| ALL_PLUGINS                           |
| APPLICABLE_ROLES                      |
| CHARACTER_SETS                        |
| CHECK_CONSTRAINTS                     |

updatedupdated2021-03-092021-03-09
加载评论