MySQL数据分析-(15)表补充:存储引擎
大家好,我是jacky,很高兴继续跟大家分享《MySQL数据分析实战》,今天跟大家分享的主题是表补充之存储引擎;
我们之前学了跟表结构相关的一些操作,那我们看一下创建表的SQL模型:
在我们创建表里,我们还有ENGINE=存储引擎,没有说,我们现在MySQL的默认引擎是InnoDB,那其实在5.5版本之前,默认的存储引擎是MyISAM,而5.5之后呢才使用的是InnoDB,本节课程jacky将讲解跟存储引擎有关的一些内容;
对于很多零基础的朋友来说,听到存储引擎这个词,是不是觉得很晦涩,很理论,其实它一点不晦涩,也一点不理论,存储引擎是整个MySQL的核心,虽然作为核心,但很多资料没有把存储引擎讲透,因为面对初学的朋友来说,能用上MySQL存储引擎的,不过就是一条SQL语句;比如说:ENGINE=InnoDB,并且这是在创建库或者是创建表的时候才能用上它,如何你不写它,系统也会默认给你一个生成,对于一些做数据分析或是产品经理等朋友来说,需要的数据我能从数据库里查询调用就行,没有必要把原理搞的这么清楚,所以才会有些朋友,使用了几年的MySQL,现在还是搞不清存储引擎是什么,所以有些人工资和能力总是停滞不前也是这个原因,业务需要精进,对于个人的职业发展是必要的条件,当你抱怨你的现实跟理想差距怎么这么大的时候,我们有没有想过,我们的才华跟我们的梦想是不是相匹配,我们是不是要提升我们的才华和能力,那当我们遇到提升能力的瓶颈时应该如何突破了,就是对我们的技能要知其然,更要之所以然;
jacky说了这么多,就是告诉大家,存储引擎很重要,SQL语句很简单,但是这句SQL语句背后的意义,我们更要重视和理解,好,开篇说完,我们正式开始讲存储引擎,第一部分,还是跟以往的分享一样,给大家梳理一下本课时的逻辑线;
逻辑线
- 什么是存储引擎,为什么我们要学习存储引擎,它应用的背景是什么, 为什么MySQL和大多数数据库不同,MySQL有一个存储引擎概念,而大多数其他的数据库没有存储引擎这个概念,学了数据库我们能解决什么现实问题;
jacky再给大家总结一下,本课时的逻辑线就是,记一下笔记:
-
1.存储引擎是什么,MySQL的发明者把它发明出来的背景是什么;
-
2.存储引擎的应用场景是什么,它能帮助我们解决企业中的什么实际问题;
-
3.我们怎样用MySQL这个存储引擎;
这个学习逻辑线,特别的清晰,就是是什么,为什么,怎么样,这些都清楚了,存储引起也就清楚了;
(一)存储引擎是个什么东东?
1.1 存储引擎初识
- 先抛开存储引擎是什么不说, jacky之前分享了这么多MySQL内容,大家学到这里,有没有体会到MySQL到底是啥,是干什么的?说白了,MySQL就是一个用来存储数据的软件,是不是,就这么简单,它就是用来存储数据的;
- 大家记下笔记:MySQL的核心是存储引擎;没有存储引擎,MySQL是存储不了数据的,这就是存储引擎,所以说它很重要;
1.2 如何深入浅出的理解存储引擎
开过汽车或了解汽车的朋友都知道,手动挡汽车里有一个离合器的东西,大家也都知道只有左脚踩上离合器,汽车才能挂上挡,加油后汽车才能启动;但是,问大家为什么踩上离合器汽车才能启动,大部分人是回答不上来的,同理,一些朋友对于MySQL中的存储引擎也是这样的,存储引擎是什么,都有一些模糊的理解,关于存储引擎是怎样在MySQL中起作用的大部分人也是说不清的;
好,那接下来就是,我们为什么一定要掌握存储引擎的原理,大家思考,汽车的离合器坏了,有修车长和4S店给你修,你的存储引擎在MySQL配置中出了错,你找谁去修,让别的同事去修,这大多是行不同的,所以,我们要知道存储引擎到底在MySQL中是如何起作用的?
-
我们该怎么学才能搞清楚存储引擎呢?还是借用离合器那个类比,我们要搞懂离合器在汽车中是如何起作用的,是不是要先搞懂汽车的结构,进而才能知道离合器在整个汽车结构中处于什么样的作用;
-
同理道理,要搞清楚存储引擎,我们也要先搞懂MySQL的架构体系,或者说是MySQL的物理组件,我们才能深刻的理解存储引擎,好,这个逻辑我们捋顺了,我们就按照这个逻辑来学习吧
1.3 MySQL构架体系(物理组件)
先来看下,MySQL的构架体系图:
这张图可以告诉我们MySQL具体是怎么执行的,我们看下MySQL是由哪几部分组成的,从结构表里看有SQL接口、解析器、优化器、缓存、存储引擎,等等这么多,是不是,下面jacky分别来说一些每部分分别是什么:
-
Connectors:不同语言中与SQL的交互接口;
-
Management Serivices & Utillities:系统管理和控制工具
-
Connection Pool:连接池
- 管理缓冲用户的连接,包括线程处理需要缓冲的需求,就通过连接池来实现;
-
SQL Interface:接收用户的SQL指令,并且返回需要查询的结果
- 比如我们写了SELECT * FROM 表名,就可以得到结果,包括我们写一个创建表的语句,都是写的SQL语句,通过SQL Interface来接收指令,并且返回结果
-
Parser:解析器
- 其实我们的SQL指令传到解析器的时候,先会被解析验证和进行解析,先验证一下我们写的SQL语句是否对,接着再来解析,其实它解析的时候也不是整个SQL语句进行解析,它是把一个大的 SQL语句拆分成我们这样一块一块的来解析,如果在分析过程中遇到错误,那么就说明这个SQL语句有问题,那就会返回一个错误,是这样的一个效果;
-
Optimizer:查询优化器
-
我们的SQL语句在查询之前,就会使用到这个查询优化器,来对我们的查询进行优化,查询优化器使用的策略是(简单了解下):
-
1)选取 ➡️2)投影➡️3)连接
- 举一个简单的例子:SELECT name FROM user WHERE age>18;MySQL的查询机制是这样的,MySQL先根据条件筛选出一部分记录, 而不是把所以条件都筛选出来,再筛选出age>18的记录,不是这样的;那接着,筛选出来记录之后,要查name字段,只拿name字段的值,而不是把所以字段都拿出来之后,再取name字段的值;最后把这两个结果结合在一起返回给你,是这样的一个查询机制和过程;这就是我们说的查询优化器;
-
-
-
Caches & Buffers:查询缓存
- 查询缓存什么意思,如果说我们查询缓存中有命中的一个查询结果,它就不会去后面查了,直接使用缓存中去读取数据;如果缓存中没有,它在去后面去查,是这样的一个过程;
-
Engine:存储引擎
- 接着就是我们的Engine了,这就是为什么我们先要介绍MySQL的物理组件,再来介绍存储引擎,MySQL中的存储引擎也是MySQL中比较大的特色,我们看到这个图中有很多小插销,那它代表的意义是什么呢?就是代表我们的存储引擎是可以插拔的,那这里面我们用到谁就可以插谁,那我们看到,这里面有这么多存储引擎,我们使用谁,我们就可以加上谁,接着在后面我们看到还有一个加号,加号的意思是什么呢?加号的意思是我们的存储引擎是可以拓展的,当然了,如果你有能力,你可以自己来写一个存储引擎,像我们的BAT,它们可以根据自己的业务自己定制一个存储引擎,
-
File system /File & Logs:文件和日志的存储,这个就没什么说的了 ;
接着上次的分享,jacky跟大家说了存储引擎的第一个逻辑线,存储引擎是什么?对于MYSQL的构架体系,jacky在这次分享的开头再做一下补充说明,就是jacky讲这个MySQL的构架体系,是为了让大家理解存储引擎在MySQL中的作用,是这个目的,对于其他的MYSQL构架大家有个印象,了解就好,不必过于纠结,当然知道的越多,对存储引擎的理解就越深,当然,单单只是了解,也不耽误我们接下来的学习;
好,我们回归主题, 按照我们的逻辑线,我们讲完第一部分存储引擎是什么,
接下来我应该讲存储引擎的应用场景是吧,讲它是怎样帮助我们解决问题的,最后讲我们应该怎样用存储引擎,也就是在MySQL应该怎样创建这个存储引擎,是吧,按照这个逻辑讲是不是就会很清楚了;我们先记下笔记,把这个逻辑框架先记下来:
笔记:(二)存储引擎的应用场景
笔记:(三)存储引擎怎样用;
(二)存储引擎怎么用
好,关于第二部分,涉及的内容比较多,jacky先讲第三个逻辑线就是存储引擎怎么用,换句话说,就是在MySQL里,我们创建表的时候,应该如何创建我们的存储引擎;
3.1 存储引擎创建的sql语句
- 大家有没有思考过,我们第四章的总目录叫SQL基础操作之表操作,我们看下我们都讲了什么?
CREATE TABLE 表名(
字段名1 数据类型 [属性] 索引,
字段名1 数据类型 [属性] 索引,
… …
)ENGINE=存储引擎 CHARSET=字符集;
- 大家有没有看到关于表补充,jacky讲的都是上面这个创建表的SQL模型,那本节课程,说白了我们就是讲了一个SQL语句,就是ENGINE=存储引擎,当工作时,我们实际代码操作就这么多,下面的分享,jacky会说,这条存储语句SQL语句可以替换为InnoDB,也可以替换成MyISAM,或是其他的存储引擎,是吧,存储引擎真的很简单;
(三)存储引擎的应用场景
我们知道存储引擎怎么用了,ENGINE=要替换的存储引擎,我们还用知道为什么要这样用,我们什么时候用ENGINE=InnoDB,什么时候用ENGINE=MyISAM,都是我们这部分要探讨的问题;
3.1 存储引擎汇总
我们要想知道各种不用类型存储引擎的应用场景,首先要知道MySQL中有多少种类型的存储引擎是吧,我们打开MySQL软件看一下:
SHOW ENGINES\G
show engines之后,jacky给大家讲解下相关的选项信息
-
ENGINE:存储引擎名称
-
SUPPORT:是否支持此存储引擎
-
COMMENT:存储引擎的注释
-
TRANSACTIONS:是否支持事务
-
XA:是否支持分布式交易处理的XA规范
-
SAVEPOINTS:是否支持保存点,以便事务回滚到保存点
好,这时初学的朋友会说,哎,jacky你说的太理论了,什么是事务,什么是XA规范,什么又是事务回滚呢?
大家这里只要先理解一个概念就好了,就是什么是事务,关于其他的一些理论名词,我们听过就行,先不用管它,但是事务一定要明白什么意思,在面试和实际工作中这个词都是十分重要的;
3.2 什么是事务
上面是这些选项的一个意义,可以通过show engines查看所有存储引擎,当我们建库的时候,或者建表的时候,当我们没有指定存储引擎,我们使用的就是默认的存储引擎,在MySQL的版本在5.5之前默认的都是MyISAM,而5.5之后呢才使用的是InnoDB;我们可以通过下面这个SQL语句查看当前的默认存储引擎,语句是:
SHOW VARIABLES LIKE \'storage_engine\';
- 我们可以看到默认的存储引擎是InnoDB,当然我们在建表,建库的时候也可以指定不同的存储引擎,那接下我们就看一下各种存储引擎之间有什么不同特性,包括适用在哪些业务场景下,那接下来,jacky就带着大家一一来看这些存储引擎,看看这些存储引擎的特点以及不同的应用场景;
3.1 MyISAM存储引擎
3.1.1 MyISAM的演变
- MySQL5.5 之前一直默认的存储引擎都是MyISAM,MyISAM的前身是ISAM,实际上那时还没有存储引擎的概念,ISAM只是一种算法,或者说是数据的处理方式,随着MySQL的发展,MySQL的架构是不断的发展和演进,最终才引进了我们开始在物理组件图中,看到的这种架构的形式,那我们的存储引擎也是可插拔式的,是很颠覆的一个形式,那ISAM也进化到了我们的MyISAM,并且也是作为MySQL默认的存储引擎,直到5.5之后,InnoDB才取代了MyISAM,那可能有朋友会说这个InnoDB一定很牛啊,但是呢你不了解MyISAM,你也不知道,也InnoDB相比,各自的优势和劣势是什么,现在也不是说MyISAM用不到了,同样有很多场景需要用到MyISAM存储引擎;
3.1.2 测试MyISAM存储引擎
我们学习每个存储引擎,都要学习这些存储引擎的特点,正是因为我们知道了这些存储引擎的特点,才能选择合适的存储引擎;因为存储引擎对于我们数据的存储包括索引,起着关键性的作用;
-
(1)默认MyISAM 的表会在存盘中产生3个文件:
-
.frm:表结构文件
-
.MYD:数据文件
-
.MYI:索引文件
-
-
(2)可以在建表的时候指定数据文件和索引文件的存储位置,只有MyISAM表支持,其他的存储引擎如果写上也是没有效果的:
-
DATA DIRECORY [=] 数据保存的绝对路径
-
INDEX DIRECORY [=] 索引文件保存的绝对路径
-
-
(3)MyISAM单表最大支持的数据量:2的64次方条记录,每个表最多可以建立64个索引
并不是说MyISAM支持的少,有很多No就说明它不行,MyISAM在5.5之前作为MySQL默认的存储引擎已经有10年了,包括现在我们系统中的表的存储引擎还是MyISAM,只不过它不是默认的存储引擎了,我们看一下
show databases;
use information_schema;
show tables;
show create table views;
- 我们看到,我们安装完MySQL数据库后,系统自带的几个库,包括mysql,information_schema,这几个库使用的存储引擎都是MyISAM,所以说MyISAM还是有它的用处的,它还是很强大的,不过它的缺点也很明显,下面我们来总结下MyISAM的优点缺点有什么;
3.1.3 MyISAM的优点与缺点
-
优点
- 对于查询和写入场景来说,MyISAM查询快,写入也快
-
缺点
-
(1)锁粒度太粗
- 是表级锁,不是行级锁,对于我们实时应用的场景,它的响应速度不是很理想;
-
(2)不支持事务
- 像我们银行,金融类的场景是用不了MyISAM存储引擎的;
-
3.1.4 MyISAM支持的三种存储格式
-
(1)定长(静态)FIXED
- 静态格式是最简单,也是最安全的格式,如果说我们出现数据崩溃了,它也是最快恢复的,同样的查找数据也是最快的,它很容易在我们的磁盘中定位和查找我们的记录;
-
(2)动态 DYNAMIC
- 动态表处理数据要复杂一些,它在每行会有一个行头来标识我们这行的长度,但是我们这个长度又是不固定的,,所以我们每次写入都会重新来标定,如果说我们要经常更新我们的表,它同样的会产生一些碎片,我们需要使用响应的工具来消除我们的碎片,它的好长是占用的空间小,就像前面jacky分享的char和varchar的区别,var是以空间换时间,而varchar是以时间换空间
-
(3)压缩 COMPRESSED
定长和动态不需要我们特殊指定,它会在我们创建表的时候,根据我们的字段类型,自动的去适配,假如我们都是CHAR类型的,它就是我们的静态表,如果说有VARCHAR,TEXT,当我们创建表时,就是动态表;
像我们压缩的存储格式,我们必须通过一个工具myisampack来创建,这个后面jacky讲工具时会说,这里就不再提了;
3.2 InnoDB存储引擎
在5.5之后,InnoDB是我们默认的存储引擎,也可以说是最重要的,也是最常用的存储引擎;InnoDB是业界公认的高性能,高可用性而且是使用频率最广泛的存储引擎,已经具有不可撼动的地位,相比于其他的存储引擎,它具有哪些特性呢?
3.2.1 特性
-
特性一:设计遵循ACID模型,支持事务,具有从服务崩溃中恢复的能力,能够最大限度的包括我们用户的数据
-
ACID模型其实就是我们事务的四个特性:
-
原子性(Atomiocity)
-
一致性(Consistency)
-
隔离性(Isolation)
-
持久性(Durability)
-
-
-
特性二:支持行级锁,可以提升多用户并发时的读写性能;
-
特性三:支持外键,保存了数据的一致性和完整性;
-
特性四:InnoDB拥有自己独立的缓冲池,常用的数据和索引都在缓存中;
-
特性五:对于INSERT、UPDATE、DELETE操作,InnoDB会使用一种change buffering机制来自动优化,还可以提供一致性的读,并且还能够缓存变更的数据,减少磁盘I/O,提高性能
3.2.2 测试InnoDB存储引擎
-
创建InnoDB表后会产生两个文件
-
.frm 表结构文件
-
.ibd 数据和索引存储表空间中
- 以后我们也可以单独的指定数据保存在哪儿,包括索引保存在哪儿,这里先不说,不说跟它相关的一些配置,因为这些配置选项太多了,以后大家要是学习优化了,那时在去学习
-
3.2.3 一些经验
-
所有的表都需要创建主键,最好配合自增的属性,也可以放到经常查询的列,作为主键
-
我们可以根据应用的需要,选择如何存储,MySQL默认支持多种存储引擎,以适用不同领域的数据库的需要,我们可以通过选择适用不用的存储引擎,提高应用的效率,提供灵活的存储,以达到最大程度可指定性,