目录
文章部份来始于黑马Mysql视频教程当中!
一、MySQL体系结构
如右图,Mysql总共分为了四层:
二、存储引擎简介
引擎就是底盘,引擎就是一个机器的核心部份,不同的引擎有着不同的应用场景,诸如客机有客机的引擎,湖人有鹈鹕的引擎,她们之间是没有优劣之分的,我们只须要在合适的场景使用合适的引擎就可以了。
Mysql储存引擎就是储存数据、建立索引、更新/查询数据等技术的实现方法。储存引擎是基于表的,而不是基于库的,所以储存引擎也可被称为表类型。
三、存储引擎的使用
(1)创建表的时侯可以通过ENGINE来指定储存引擎:
(2)查看当前数据库支持的储存引擎:
创建表的时侯如果不指定引擎,默认就是InnoDB,在mysql初期的时侯默认储存引擎是MyISAM。其中comment列就是官方对当前储存引擎的特点描述!
(3)查看某张表使用的储存引擎
如下sql可以查看当前表结构:
show create table 表名;
四、存储引擎特性
这儿重点解释三个储存引擎,同时也是笔试当中常常会问的!
1、InnoDB
InnoDB是一种兼具高可靠性和高性能的通用储存引擎,在MySQL5.5以后,InnoDB是默认的MySQL储存引擎。
(1)特征:
DML操作遵守ACID模型,支持事务;行级锁,提升并发访问性能;支持字段FOREIGNKEY约束,保证数据的完整性和正确性;
(2)不管是那个引擎,数据肯定都是储存在硬碟的,我们可以通过以下命令查看储存位置:
SHOW VARIABLES LIKE 'datadir';
按照查询的位置打开,之后会发觉每位数据库就是一个文件夹
之后任意打开一个库进去会发觉都是frm文件!
frm文件是拿来保存每位数据表的元数据信息,包括表结构的定义等。根本没有找到对应的数据文件,这是为何呢,继续往下看!
(3)储存文件:
正常innodb引擎储存表的时侯会有两个文件,一个是frm文件,一个是ibd文件。
Xxx.ibd:xxx代表的是表名,innoDB引擎的每张表还会对应这样一个表空间文件,储存该表的数据和索引。
但是我们在里面并没有看见ibd文件,这是由于mysql将储存方法分为了两种:
可以通过innodb_file_per_table参数来开启独立表空间,mysql8.0默认是打开了独立表空间,其余似乎默认都是关掉的。
innodb_file_per_table的简略说明:
在好久好久曾经也就是说还没有innodb_file_per_table的那种年代,所有的innodb表的数据都是保存在共享表空间,在有了innodb_file_per_table参数后innodb可以把每位表的数据单独保存。单独保存有两方面的优势一个是便捷管理,二个是提长性能。
show global variables like 'innodb_file_per_table'; -- 查看
set @@global.innodb_file_per_table=off; -- 关闭
set @@global.innodb_file_per_table=on; -- 打开innodb_file_per_table
innodb_file_per_table参数,mysql8.0默认是打开的,假如打开就代表的是每一张表对应了一个表空间。我的mysql是5.5版本的,所以根本没有开启,没有开启着意味着所有数据共用了一个表空间(也可以称为数据文件)。
(4)共享表空间文件上哪找?
默认配置下有一个初遇大小为10M,名为ibdata1的文件,默认的表空间文件(tablespacefile)。通过参数innodb_data_file_path可以设置文件
show global variables like 'innodb_data_file_path'; #查看表空间文件设置
解释ibdata1:10M:autpextend:代表的是表空间文件名为ibdata1,之后初始大小为10M,文件可以手动下降(autoextend)。
(5)通过以上命令我们晓得表空间文件名称为ibdata1,这么他储存在哪些地方?
他储存在我们安装mysql的时侯指定的安装目录下,假如忘掉安装目录了,可以通过全局搜文件名称,来找寻文件!
整个mysql所有库的数据都储存在下边文件当中!
(6)可以更改共享表空间设置:
表示将/db/ibdata1和/dr2/db/ibdata2两个文件来组成表空间,其中ibadata1的大小为2000Mmysql 表空间清理 碎片整理,文件ibdata2的大小为2000MB,假如用完了这2000MB,该文件可以手动下降(autoextend)。
innodb_data_file_path=/db/ibdata1:2000M;/dr2/db/ibdata2:2000M:autoextend
(7)将innodb_file_per_table打开
set @@global.innodb_file_per_table=on; -- 打开
打开后他不会将历史的表早已共享的给单独独立上去,而是指的之后在新建表的时侯,这么新建的表就是单独的表空间。
打开后新建了一个test表:
通过MySQL的ibd2sdi工具可以解析ibd文件,可以解析成json数据。
(8)innodb储存结构:
说是innodb储存结构,不如说是ibd文件的储存结构!
page页是innodb储存结构当中最小的单元
具体了解储存结构的话内容有好多,后续写一篇专门剖析储存结构的文章!
2、MyISAM
MyISAM是MySQL初期的默认储存引擎。这也就是常常笔试问Innodb和MyISAM区别的缘由!
(1)特性:
不支持事务不支持字段支持表锁,不支持行锁访问速率快
(2)储存文件:
一个表对应了三个文件mysql 表空间清理 碎片整理,而innodb对应了两个文件!
3、MEMORY
MEMORY引擎的表数据是储存在显存中的,因为遭到硬件问题、或断电问题的影响,只能将这种表作为临时表或缓存使用。
(1)特性:
显存储存hash索引(默认)
(2)储存文件:
xxx.sdi:储存表结构信息
五、存储引擎选择
在选择储存引擎时,应当按照应用系统的特征选择合适的储存引擎。对于复杂的应用系统,还可以依据实际情况选择多种储存引擎进行组合。
在问你InnoDB和MyISAM的区别的时侯,只须要围绕这三点来回答:事务、外键、行级锁
暂无评论内容