MySQL数据分析-(15)表补充:存储引擎

你们好,我是jacky,很高兴继续跟你们分享《MySQL数据分析实战》,今天跟你们分享的主题是表补充之存储引擎;mysql


咱们以前学了跟表结构相关的一些操做,那咱们看一下建立表的SQL模型:web

在咱们建立表里,咱们还有ENGINE=存储引擎,没有说,咱们如今MySQL的默认引擎是InnoDB,那其实在5.5版本以前,默认的存储引擎是MyISAM,而5.5以后呢才使用的是InnoDB,本节课程jacky将讲解跟存储引擎有关的一些内容;面试


对于不少零基础的朋友来讲,听到存储引擎这个词,是否是以为很晦涩,很理论,其实它一点不晦涩,也一点不理论,存储引擎是整个MySQL的核心,虽然做为核心,但不少资料没有把存储引擎讲透,由于面对初学的朋友来讲,能用上MySQL存储引擎的,不过就是一条SQL语句;好比说:ENGINE=InnoDB,而且这是在建立库或者是建立表的时候才能用上它,如何你不写它,系统也会默认给你一个生成,对于一些作数据分析或是产品经理等朋友来讲,须要的数据我能从数据库里查询调用就行,没有必要把原理搞的这么清楚,因此才会有些朋友,使用了几年的MySQL,如今仍是搞不清存储引擎是什么,因此有些人工资和能力老是停滞不前也是这个缘由,业务须要精进,对于我的的职业发展是必要的条件,当你抱怨你的现实跟理想差距怎么这么大的时候,咱们有没有想过,咱们的才华跟咱们的梦想是否是相匹配,咱们是否是要提高咱们的才华和能力,那当咱们遇到提高能力的瓶颈时应该如何突破了,就是对咱们的技能要知其然,更要之因此然;算法


jacky说了这么多,就是告诉你们,存储引擎很重要,SQL语句很简单,可是这句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的构架体系图:

@数据分析-jacky

这张图能够告诉咱们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


接着上次的分享,jacky跟你们说了存储引擎的第一个逻辑线,存储引擎是什么?对于MYSQL的构架体系,jacky在此次分享的开头再作一下补充说明,就是jacky讲这个MySQL的构架体系,是为了让你们理解存储引擎在MySQL中的做用,是这个目的,对于其余的MYSQL构架你们有个印象,了解就好,没必要过于纠结,固然知道的越多,对存储引擎的理解就越深,固然,单单只是了解,也不耽误咱们接下来的学习;

好,咱们回归主题, 按照咱们的逻辑线,咱们讲完第一部分存储引擎是什么,
接下来我应该讲存储引擎的应用场景是吧,讲它是怎样帮助咱们解决问题的,最后讲咱们应该怎样用存储引擎,也就是在MySQL应该怎样建立这个存储引擎,是吧,按照这个逻辑讲是否是就会很清楚了;

咱们先记下笔记,把这个逻辑框架先记下来:
笔记:(二)存储引擎的应用场景
笔记:(三)存储引擎怎样用;

(二)存储引擎怎么用

好,关于第二部分,涉及的内容比较多,jacky先讲第三个逻辑线就是存储引擎怎么用,换句话说,就是在MySQL里,咱们建立表的时候,应该如何建立咱们的存储引擎;

3.1 存储引擎建立的sql语句

  • 你们有没有思考过,咱们第四章的总目录叫SQL基础操做之表操做,咱们看下咱们都讲了什么?
    数据分析-jacky
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;

@数据分析-jacky

  • 咱们看到,咱们安装完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默认支持多种存储引擎,以适用不一样领域的数据库的须要,咱们能够经过选择适用不用的存储引擎,提升应用的效率,提供灵活的存储,以达到最大程度可指定性,

相关文章
相关标签/搜索