mysql程序架构
连接器
各种编程语言的编程接口
连接池
负责认证,并发连接数管理,内存检查,缓存等
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
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 |