zoukankan      html  css  js  c++  java
  • 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的构架体系图:

    @数据分析-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 ENGINESG

    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默认支持多种存储引擎,以适用不同领域的数据库的需要,我们可以通过选择适用不用的存储引擎,提高应用的效率,提供灵活的存储,以达到最大程度可指定性,

  • 相关阅读:
    函数式宏定义与普通函数
    linux之sort用法
    HDU 4390 Number Sequence 容斥原理
    HDU 4407 Sum 容斥原理
    HDU 4059 The Boss on Mars 容斥原理
    UVA12653 Buses
    UVA 12651 Triangles
    UVA 10892
    HDU 4292 Food
    HDU 4288 Coder
  • 原文地址:https://www.cnblogs.com/shujufenxi/p/10128275.html
Copyright © 2011-2022 走看看