我们MySQL的连接层主要是架构图中的Connectors、Connection Pool和Enterprise Management Services & Utilities,它主要完成两部分工作:
SQL处理层主要包括SQL Interface、Parser、Optimizer 和 Caches&Buffers ,这一层主要功能有:SQL语句的解析、优化,缓存的查询,MySQL内置函数的实现,跨存储引擎功能(所谓跨存储引擎就是说每个引擎都需提供的功能(引擎需对外提供接口)),例如:存储过程、触发器、视图等。
首先我们先来看一看缓存的部分,我们要清楚的MySQL默认缓存的是我们的SQL执行语句,而不是查询后的结果数据,但是对于查询后的数据我们也是可以将其开启的,我们可以先看看MySQL是否开启了数据缓存(默认不开启)
我们可以通过配置文件my.ini
进行开启其数据缓存及设置其缓存的大小(需重启MySQL服务)
query_cache_type = 1
query_cache_size = 600000
当然我们也可以通过命令行来进行设置,不过重启后就需要重新设置
set global query_cache_type = 1;
set global query_cache_size = 600000;
设置完成后我们就可以进行查看上述命令查看是否成功开启了,还可以查看去缓存的大小,如下:
show variables like '%query_cache_size%'
我们在查询SQL语句前,先经过了查询缓存的那一步,如果没有相应的缓存,我们会进行下一步解析查询,为什么会对我们的SQL语句进行解析呢?因为我们每个人写的SQL都是不一样的,MySQL会对SQL语句进行解析,使其按照特定的流程进行执行,如下:
MySQL还会对我们的SQL语句进行一些优化,比如select * from tableName where 1 = 1
这个语句,我们的MySQL在执行过程中就会对其进行优化,会去除其where条件后的语句。
再比如我们一张表中,如果设置了id为主键,那么就意味着其id不可能为空,那么我们在查询select * from tableName where id is null
类似的语句时,那么它就不会去查询我们的表,我们可以通过explain进行验证
MySQL5.5之前默认的存储引擎,MyISAM 存储引擎由MYD和MYI组成
我们可以在MySQL目录下的data文件夹下找到对于的数据库下的表
我们可以看出MyISAM引擎中其数据文件和索引文件是分开进行存储的,所以MyISAM又称为非聚簇索引
MyISAM特性:
这里我们主要来看一下其第3点,支持数据压缩,我们来看一看它是如何进行数据压缩的,其实就是在MySQL的bin目录下,如下:
我们可以使用 myisampack -b -f xxx.MYI
进行压缩,如下
不过我们本来就没有存储任何的数据,所以看不出其空间上大小的变化,但是我们会发现多出了一个 .OLD
的文件,如下:
注意:我们压缩完之后,可以删除或备份其.OLD文件,但是有可能压缩会导致我们的数据出现问题,如不能进行修改或新增等,这里我们可以使用CHECK table 表名
进行检查,使用REPAIR table 表名
进行修改操作。
MyISAM适用场景:
MySQL5.5以及以后版本默认存储引擎,MySQL5.6以前默认为系统表空间,MySQL5.6及其以后默认为独立表空间。那么什么是系统表空间和独立表空间呢?我们先来通过innodb_file_per_table
查看一下我们MySQL是哪一种
ON:独立的表空间:tablename.ibd
OFF:系统表空间:ibdataX
上述我们可以看出我们使用的是独立表空间,这里我们查看一个数据库,如下:
同样的,我们可以在MySQL目录下的data文件夹下找到对于的数据库下的表
我们可以看出InnoDB引擎中其数据文件和索引文件是在同一个文件中进行存储的,所以InnoDB又称为聚簇索引
看完了独立表空间的例子,那么我们的系统表空间呢?这里我们先将数据库设置为系统表空间 set global innodb_file_per_table=off;
然后我们同样建立一个Innodb引擎的表 innodb2
,然后我们同样去查看其文件结构
我们发现独立表空间下的表只有.frm文件,那么它的数据文件和索引文件存储在什么地方的呢?其实它就是存储在我们系统统一的位置,如下:
这里我们一般建议使用独立表空间,因为
optimize table 表名
收缩系统文件InnoDB的特性及适用场景:
MyISAM引擎和InnoDB引擎就是我们日常工作中最常用的两种数据库引擎,我们来比较一下
对比项 | MyISAM | InnoDB |
---|---|---|
主外键 | 不支持 | 支持 |
事务 | 不支持 | 支持 |
行表锁 | 表锁,即使操作一条记录也会锁住整个表 不适合高并发的操作 |
行锁,操作时只锁某一行,不对其它行有影响 适合高并发的操作 |
缓存 | 只缓存索引,不缓存真实数据 | 不仅缓存索引还要缓存真实数据,对内存要求较高, 而且内存大小对性能有决定性的影响 |
表空间 | 小 | 大 |
关注点 | 性能 | 事务 |
默认安装 | Y | Y |
数据以文本方式存储在文件,如下:
我们会发现它是以csv文件进行存储的,可以对数据文件直接编辑(保存文本文件内容),这里我们可以先存储一些数据,然后打开进行查看
当然我们也是可以使用记事本打开,在这其中我们可以直接修改其数据,如下我们使用记事本打开进行修改数据,注意我们在数据的最后的一条记得换行(如果是多列数据,那就是使用 ,
逗号进行分割)
CSV存储引擎特点:
1和4我们都已经介绍过来,这里我们再看一下第2点和第3点,我们CSV引擎是不支持索引的,下面我们在设计表中直接加上索引进行保存,结果如下:
然后我们再来看看所有列都不能为null的特点,它不仅是指我们在存储数据是不能村粗null值,并且在创建表时就必须指定列不为空,否则无法创建表结构,如下:
Archive引擎的特点:
使用场景:日志和数据采集应用
这里我们可以查看一下默认的max_heap_table_size参数大小,如下:
我们建立一个存储引擎和Memory的表,查看其文件就会发现只有一个存储表结构的文件,因为它的数据是存储在内存之中的,所以当服务重启,数据也就没有了。
Memory引擎和我们的临时表非常的相似,都是存储在内存之中的,那么有什么不同呢?
上图中在系统使用临时表时,会判断是否超过了限制,这里的限制指的是什么呢?就是我们上面说的Memory存储引擎所有字段都是固定长度 varchar(10) = char(10)
另外当我们建立了一张临时表的时候,我们只能在本次会话中进行访问该表,比如我们再新建一个查询,就无法查询刚刚的临时表了,但是我们的Memory引擎是可以的。
需要注意的是MySQL的Ferderated引擎默认是关闭的,如下:
如果需要使用,我们可以在 my.ini
中使用 federated=1
将其打开,配置好后重启MySQL服务即可,这里我们来看看如何使用该存储引擎
这里我们模拟在远程数据库remote中新建了一张InnoDB的表remote_federated,然后随意插入几条数据
然后我们模拟在本地数据库localhost中新建一张与远程数据库remote中的remote_federated表类似的localhost_federated表,表中的表结构要保持一致,使用Federated存储引擎,如下:
其中:CONNECTION = 'mysql://账号:密码@数据库url:端口号/数据库名/表名'
我们在文件中发现它其实只存储了表结构,没有存储任何的表数据,它的数据都是全部放到远程服务器上的,当我们在本地数据库新增或删除一条数据,远程数据库中也会随之改变。