• MySQL体系结构——存储引擎


    image-20200912153703752

    MySQL的组成部分:

    • 连接池组件
    • 管理服务和工具组件
    • SQL接口组件
    • 查询分析器组件
    • 优化器组件
    • 缓冲组件(cache)
    • 插件式存储引擎(相比其他数据库比较大的区别)
    • 物理文件

    存储引擎是底层物理结构的实现,每个存储引擎的开发者可以按照自己的意愿来开发

    存储引擎是基于表的,而不是数据库。

    MySQL的存储引擎

    MySQL数据库独特的插件式存储引擎结构,每个存储引擎都有自己的特点,能够根据不同的应用建立不同存储引擎的表。MySQL开源特性使得用户可以根据自己MySQL预定义的存储引擎接口来编写自己的存储引擎。如果对于某一功能不满意可以修改源码来得到我们想要的特性。

    image-20200912160736279

    1) Innodb存储引擎

    Innodb存储引擎支持事务,其设计的目标主要面向在线事务处理(OLTP)的应用。特点是行锁设计,支持外键,并支持非锁定读,从MySQL5.5.8开始,InnoDB引擎成为MySQL的默认存储引擎。

    InnoDB存储引擎将数据存储在一个逻辑的表空间中,这个表空间像黑盒一样由Innodb本身进行管理,从MySQL4.1版本开始,将InnoDB存储引擎的表存放到一个独立的ibd文件中,InnoDB引擎支持raw block来建立表空间。

    InnoDB通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了SQL标准的4种隔离级别,默认RR

    mysql> select @@transaction_isolation;
    +-------------------------+
    | @@transaction_isolation |
    +-------------------------+
    | REPEATABLE-READ         |
    +-------------------------+
    1 row in set (0.00 sec)

    同时使用next-key locking 的策略避免幻读的现象。

    除此之外,InnoDB还提供了插入缓存(insert buffer),二次写(double write),自适应哈希索引(adaptive hash index),预读(read head)等高性能和高可用功能。

    表中数据的存储,InnoDB采用了聚集(clustered)的方式,因此每张表都按照主键的顺序进行存放。如果没有显示的在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并以此作为主键。

    2) MyISAM存储引擎

    MyISAM存储引擎不支持事务、表锁设计,支持全文索引,主要面向一些OLAP数据库应用。在MySQL5.5.8版本之前MyISAM是默认的存储引擎。MyISAM存储引擎与其他引擎比较不同的 地方是它的缓冲池只缓存索引文件,而不缓存数据文件。

    MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件。可以使用myisampack来对数据文件进行压缩和解压。但是经过压缩的表是只读的。

    MySQL5.0以前MyISAM支持单表大小为4G,更大需要指定隐藏属性规则。MySQL5.0以后默认支持256TB单表数据。

    3) NDB存储引擎

    NDB存储引擎是一个集群存储引擎,类似于Oracle RAc,不过与Oracle RAC share everything 不同的是,这个引擎的结构是share nothing,因此可以提供更高的可用性。NDB的特点是全部存放在内存中(从MySQL5.1开始可以将非索引数据放在磁盘上)因此这个引擎的主键查找速度极快。并且通过添加NDB数据节点(Data Node)可以线性的提高数据库的性能,是最高可用、高性能的集群系统。注意,NDB存储引擎的join操作是在MySQL的数据库层完成的而不是存储引擎层完成的。这也意味着复杂的连续操作需要巨大的网络开销,因此查询速度很慢。

    4) Memory存储引擎

    Memory存储引擎,以前被称为HEAP存储引擎,将表中的数据存放在内存中,如果数据库发生重启或者崩溃,表中的数据将会消失,它非常适用于存放临时表,以及数据仓库中的纬度表。Memory存储引擎默认使用hash索引,而不是B+tree。

    Memory存储引擎速度非常快,但是使用上有很大的限制。只支持表锁,并发性能比较差,不支持Text,BLOB数据类型。还有一个问题,当MySQL使用Memory存储引擎作为临时表来存放查询的中间结果集。如果中间结果集大于Memory存储引擎表的容量或者这个结果集中间存在Text,BLOB字段,MySQL会将其转换成MyISAM存储引擎表来存放到磁盘上,MyISAM存储引擎并不会缓存数据文件,因此这时产生的临时表的性能对查询而言并不好。

    5)Archive存储引擎

    Archive存储引擎只支持INSERT和SELECT操作,从MySQL5.1开始支持索引。Archive存储引擎使用Zlib算法将数据行(row)进行压缩后存储,压缩比一般可达1:10。Archive存储引擎非常适合存储归档数据,比如日志信息。使用行锁来实现高并发的插入操作,但本身并不是事务安全的存储引擎,其设计的主要目的是提高高速插入和压缩功能。

    6)Federated存储引擎

    Federated存储引擎表并不存放数据,它只是指向一台远程的MySQL服务器上的表,这非常类似于SQL server上的链接服务器和Oracle中的透明网关,不同的是这个引擎只支持MySQL数据表,而不支持其他异构数据库表。

    7)Maria存储引擎

    Maria存储引擎是新开发的存储引擎,目标是取代原本的MyISAM引擎,设计者也是MySQL的创始人之一。可以看作是MyISAM的后续升级版本,这个引擎在MyISAM上做出了很多的优化,它的特点是支持缓存数据和索引文件,应用了行锁设计,提供了MVCC功能,支持事务和非事务的安全选项,以及更好的BLOB字符类型的处理性能。

    8)其他存储引擎

    MySQL还有很多存储引擎,如Merge,CSV,Sphinx和InfoBright。不同的引擎都有各自适合的场景。

    问题:

    [] 哪些MySQL存储引擎支持全文索引?

    MyISAM,InnoDB,Sphinx存储引擎都支持全文索引

    []MySQL数据库快是否是因为它不支持事务?

    不是的,虽然MySQL的MyISAM不支持事务,但是InnoDB是支持的。而快这个概念也应该是针对不同的场景而言的,对于ETL这种操作当然是MyISAM更有优势,但在OLAP环境中,InnoDB引擎的效率会更好。

    []数据量超过1000万,MySQL的性能会急剧下降?数据库随着数据行数的增加性能都会有所下降,但不是线性的,选择正确的引擎和正确的配置再多的数据量MySQL也是可以承受的。

    各存储引擎之间的比较:

    image-20200913173517895

    与引擎相关的查询:

    查询当前数据库支持哪些引擎:

    mysql> show enginesG
    *************************** 1. row ***************************
          Engine: BLACKHOLE
         Support: YES
         Comment: /dev/null storage engine (anything you write to it disappears)
    Transactions: NO
              XA: NO
      Savepoints: NO
    *************************** 2. row ***************************
          Engine: MyISAM
         Support: YES
         Comment: MyISAM storage engine
    Transactions: NO
              XA: NO
      Savepoints: NO
    *************************** 3. row ***************************
          Engine: FEDERATED
         Support: NO
         Comment: Federated MySQL storage engine
    Transactions: NULL
              XA: NULL
      Savepoints: NULL
    *************************** 4. row ***************************
          Engine: MRG_MYISAM
         Support: YES
         Comment: Collection of identical MyISAM tables
    Transactions: NO
              XA: NO
      Savepoints: NO
    *************************** 5. row ***************************
          Engine: PERFORMANCE_SCHEMA
         Support: YES
         Comment: Performance Schema
    Transactions: NO
              XA: NO
      Savepoints: NO
    *************************** 6. row ***************************
          Engine: InnoDB
         Support: DEFAULT
         Comment: Supports transactions, row-level locking, and foreign keys
    Transactions: YES
              XA: YES
      Savepoints: YES
    *************************** 7. row ***************************
          Engine: MEMORY
         Support: YES
         Comment: Hash based, stored in memory, useful for temporary tables
    Transactions: NO
              XA: NO
      Savepoints: NO
    *************************** 8. row ***************************
          Engine: CSV
         Support: YES
         Comment: CSV storage engine
    Transactions: NO
              XA: NO
      Savepoints: NO
    *************************** 9. row ***************************
          Engine: ARCHIVE
         Support: YES
         Comment: Archive storage engine
    Transactions: NO
              XA: NO
      Savepoints: NO
    9 rows in set (0.00 sec)




  • 相关阅读:
    8.5 day8
    8.1 day6
    课后作业 day29
    博客整理day29
    博客整理day28
    博客整理day27
    博客整理day26
    课后作业 day26
    Python 学习day22
    课后作业 day21
  • 原文地址:https://www.cnblogs.com/plutozzl/p/13667220.html
Copyright © 2020-2023  润新知