谈谈MySQL存储引擎

本文首发于我的微信公众号《andyqian》,期待你的关注!

前言

  你们周末过的还愉快吗?一眨眼周末就过去了,明天得上班写BUG了。What?写BUG?没错,就是写BUG,为此测试”房姐”调侃了我很多,就差没叫我「BUG」了,还在上周告诉了我一个永无BUG的方法。听到答案的我”面红耳赤”的继续写BUG。答案是什么?大家先猜猜看?mysql

引子

  在以前的文章中咱们说过MySQL事务,如今你们都应该知道了MySQL事务了吧,还记得事务的ACID原则吗?不记得的童鞋能够回顾一下《MySQL之事务初识》,其实呀,更严谨一点的话,应该是MySQL InnoDB存储引擎,由于在MySQL中,只有InnoDB存储引擎才支持事务。看到此处,有些朋友可能有如下疑问:sql

  • 存储引擎是什么?数据库

  • MySQL中有哪些存储引擎?安全

  • 每一个存储引擎有哪些特色以及区别?服务器

下面,咱们带着这些疑问,依次往下看:微信

存储引擎是什么?

  通俗一点来讲,MySQL是用来保存数据的对不对?咱们能够把存储引擎看做是一种存储文件的方式以及该方式附属的一整套工具,其中每一个存储文件方式的特色就是该存储引擎的特色。并发

例如:Memory存储引擎将数据保存至内存中,其优势是:读写快,可是数据不是持久到磁盘中的,很是容易丢失等等。app

MySQL中的存储引擎

  在MySQL 5.7版本中,MySQL支持的存储引擎有:ide

  • InnoDB工具

  • MyISAM

  • Memory

  • CSV

  • Archive

  • Blackhole

  • Merge:

  • Federated

  • Example

下面只介绍经常使用的存储引擎,其余没介绍的存储引擎,有兴趣的童鞋,能够本身自行搜索。

InnoDB:支持事务操做(如 begin, commit,rollback命令),支持行级锁,行级锁相对于表锁,其粒度更细,容许并发量更大,这里面细节还挺多的,下次,咱们单独写一篇)支持外键引用完整性约束。InnoDB存储引擎也是MySQL 5.7版本中默认的存储引擎。其缺点是:存储空间会占用比较大。

MyISAM:该存储引擎存储占用的空间相对与InnoDB存储引擎来讲会少不少,但其支持的为表锁,其并发性能会低不少,并且不支持事务,一般只应用于只读模式的应用。它是MySQL最原始的存储引擎。

Memory:该存储引擎最大的特色是,全部数据均保存在内存中,以前还有个名字叫作 「Heap」。
应用场景: 主要存储一些须要快速访且非关键数据,为何不是关键数据呢?就由于其全部数据保存在内存中,也能够理解为不安全。

CSV:首先先认识一下CSV,CSV文件其实就是用逗号分隔开的文本文件,经常使用于数据转换,该类型平时用的比较少,不支持索引。

Archive:存档文件,主要用于存储不多用到的引用文件,

Example:该存储引擎主要用于展现如何自行编写一个存储引擎,通常不会用做生产环境使用。

如何选择存储引擎

  你们经过上面的比较应该已经看出来了,InnoDB存储引擎是支持事务,支持外键并支持行级锁的。对于须要在线事务处理的应用最合适不过了,咱们在选择存储引擎时,若是没有特别的理由,个人建议是选择InnoDB做为存储引擎。

  1. 咱们能够在建立table时,指定存储引擎,若是未指定,则使用默认的存储引擎。

    create table t_base_user(
    oid bigint(20) not null primary key auto_increment comment "",
    created_at datetime null comment ''
    )engine=innodb
  2. (方法一) 显示该表的存储引擎

    mysql> show table status like "t_base_user" \G;
    *************************** 1. row ***************************
            Name: t_base_user
          Engine: InnoDB
         Version: 10
      Row_format: Dynamic
            Rows: 0
    Avg_row_length: 0
     Data_length: 16384
    Max_data_length: 0
    Index_length: 0
       Data_free: 0
    Auto_increment: 1
     Create_time: 2017-12-17 20:10:24
     Update_time: NULL
      Check_time: NULL
       Collation: utf8_unicode_ci
        Checksum: NULL
    Create_options: 
         Comment: 
    1 row in set (0.01 sec)
  3. (方法二) 显示表的存储引擎信息

    mysql> show create table t_base_user\G;
    *************************** 1. row ***************************
        Table: t_base_user
    Create Table: CREATE TABLE `t_base_user` (
    `oid` bigint(20) NOT NULL AUTO_INCREMENT,
    `created_at` datetime DEFAULT NULL,
    PRIMARY KEY (`oid`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
    1 row in set (0.00 sec)

    另外须要注意的是: 不建议修改表的存储引擎,在建立表时,就要须要考虑好,使用什么存储引擎。

今日命令

命令: show engines;
标准语法show stroage engines;
其中stroage为可选项。
做用:显示当前MySQL版本支持的存储引擎。
例子(MySQL版本: 5.7.20):

mysql> show storage engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| 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       |
+--------------------+---------+---------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

使用场景:在查看当前数据库版本支持的存储引擎,查看默认存储引擎时很是实用。

Engine:存储引擎名称。
Support: 表示MySQL当前服务器版本是否支持该存储引擎,YES为支持 NO 为不支持。
Comment:为该存储引擎的特性,如Innodb
支持事务,行级锁等。
Transactions:是否支持事务,YES为支持,No为不支持。
XASavepoints:这两个属性,与事务相关,当Transactions为Yes时,这两个属性才有意义,不然均为NO。

相关阅读:

写会MySQL索引  

十个实用MySQL命令

说说 MySQL JSON 数据类型

浅谈MySQL Online DDL(下)

最后:“房姐” 说的永无BUG的方法是:「不写代码」。

 

这里写图片描述

 扫码关注,一块儿进步

我的博客: http://www.andyqian.com

相关文章
相关标签/搜索