美文网首页
【mysql】常见的4种存储引擎

【mysql】常见的4种存储引擎

作者: 李明燮 | 来源:发表于2022-01-27 18:31 被阅读0次

    我们一般用的mysql创建表的时候默认是使用了InnoBD存储引擎。
    我本人不是计算机专业,所以刚接触mysql时没注意到它居然有好几种存储引擎。
    在不同的场景下,mysql可以选择不同的存储引擎。

    简介

    先执行下面的语句,可以看看存储引擎的种类。(基于mysql5.7版本)

    SHOW ENGINES
    
    mysql> show engines;
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    | Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    | InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
    | MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
    | MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
    | BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
    | MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
    | CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
    | ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
    | PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
    | FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    

    简单的整理了具有代表意义的4种存储引擎。
    分别是InnoDB, MEMORY,MyISAM,ARCHIVE。

    先做一个试验,看看下面的语句。

    CREATE DATABASE `test_database`;
    
    USE test_database;
    
    CREATE TABLE `aa_innodb` (
      `id` int(11) DEFAULT NULL,
      `name` varchar(100) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
    CREATE TABLE `bb_myisam` (
      `id` int(11) DEFAULT NULL,
      `name` varchar(100) DEFAULT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    
    CREATE TABLE `cc_memory` (
      `id` int(11) DEFAULT NULL,
      `name` varchar(100) DEFAULT NULL
    ) ENGINE=MEMORY DEFAULT CHARSET=latin1;
    
    CREATE TABLE `dd_archive` (
      `id` int(11) DEFAULT NULL,
      `name` varchar(100) DEFAULT NULL
    ) ENGINE=ARCHIVE DEFAULT CHARSET=latin1;
    
    

    我们可以看出来,同一个数据库中不同的表可以适用不同的存储引擎。

    SHOW TABLE STATUS FROM test_database
    
    +------------+---------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+
    | Name       | Engine  | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time         | Check_time | Collation         | Checksum | Create_options | Comment |
    +------------+---------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+
    | aa_innodb  | InnoDB  |      10 | Dynamic    |    0 |              0 |       16384 |               0 |            0 |         0 |           NULL | 2022-01-27 07:25:22 | NULL                | NULL       | latin1_swedish_ci |     NULL |                |         |
    | bb_myisam  | MyISAM  |      10 | Dynamic    |    0 |              0 |           0 | 281474976710655 |         1024 |         0 |           NULL | 2022-01-27 07:25:22 | 2022-01-27 07:25:22 | NULL       | latin1_swedish_ci |     NULL |                |         |
    | cc_memory  | MEMORY  |      10 | Fixed      |    0 |            106 |           0 |        15878376 |            0 |         0 |           NULL | 2022-01-27 07:25:22 | NULL                | NULL       | latin1_swedish_ci |     NULL |                |         |
    | dd_archive | ARCHIVE |      10 | Compressed |    0 |            106 |        8674 |               0 |            0 |         0 |           NULL | NULL                | 2022-01-27 07:25:22 | NULL       | latin1_swedish_ci |     NULL |                |         |
    +------------+---------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-------------------+----------+----------------+---------+
    

    看看每个存储引擎都有什么特点?

    InnoDB

    我们最常用的mysql存储引擎。
    我们说的mysql是关系型数据库,其实就是说mysql的InnoDB引擎。
    支持外间关联,支持事务。
    适合提供提交、回滚、崩溃恢复能力的事物安全(ACID兼容)能力,并要求实现并发控制的业务。

    MyISAM

    MyISAM引擎是一种非事务性的引擎。提供高速存储和检索,特点是支持全文搜索。
    如果数据表主要用来插入和查询记录,则MyISAM引擎能提供较高的处理效率。
    提供高速以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是好的选择。
    (我们已经习惯用其他搜索引擎了,比如Elasticsearch...)

    * InnoDB和MyISAM常见的区别

    1. 外键和事务:InnoDB是支持。 MyISAM不支持。
    2. 全文索引:InnoDB不支持,MyISAM支持。
    3. 锁表:InnoDB是根据PK锁单行操作(不是PK就锁全表)。 MyISAM是直接锁全表。所以MyISAM不适合于有大量查询和修改并存的情况。
    4. 存储:InnoDB是在内存中创建缓存池,MyISAM没有。
      InnoDB的表是存在一个文件中(也可以是分各各文件),
      MyISAM是 .frm存储表定义 .MYD (MYData)存数据。.MYI (MYIndex)存索引。
    5. 备份或移植:InnoDB数据量大的事后需要备份还原,MyISAM数据是文件形式,所以直接复制过去就行。

    MEMORY

    存在内存里的临时表格。因为是使用内存所以比InnoDB和MYISAM都快,
    但是它的数据是不稳定的,如果在关机之前没有进行保存,所有的数据都会丢失。
    适合数据量不大,并且不需要较高的数据安全性的,查询频繁而且需要较高性能的业务中。
    (我们已经习惯用了Redis了...)

    ARCHIVE

    Archive支持高并发的插入操作,但是本身不是事务安全的。
    只有INSERT和SELECT操作,可以选择Archive,Archive非常适合存储归档数据,如记录日志信息。
    (市面上有很多好用的存放日志的开源系统,还需要用Archive存放日志吗?^^;;)

    下图是简单的整理了每个引擎之间的区别,可以参考一下。

    图片备用地址

    mysql_engine

    总结

    其实我们现在除了InnoDB引擎以外,其他引擎是有更好的替代方案的。
    但是在初期或是发展期,需要过度的时候可以考虑使用这些mysql的引擎。
    毕竟我们想在项目中引入Elasticsearch或redis是会增多很多额外的开发量和费用的。
    前期资源和时间缺乏的时候可以考虑一下这些引擎也是不错的选择。


    欢迎大家的意见和交流

    email: li_mingxie@163.com

    相关文章

      网友评论

          本文标题:【mysql】常见的4种存储引擎

          本文链接:https://www.haomeiwen.com/subject/ilvahrtx.html