Mysql 核心之存储引擎

本贴最后更新于 2406 天前,其中的信息可能已经时移俗易

存储引擎是什么?

例如,如果你在研究大量的临时数据,你也许需要使用内存存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持[事务处理]的数据库(以确保事务处理不成功时数据的回退能力)。

这些不同的技术以及配套的相关功能在 MySQL 中被称作存储引擎(也称作表类型)。MySQL 默认配置了许多不同的存储引擎,可以预先设置或者在 MySQL 服务器中启用。你可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最大的灵活性。

选择如何存储和检索你的数据的这种灵活性是 MySQL 为什么如此受欢迎的主要原因。其它数据库系统仅支持一种类型的数据存储。遗憾的是,其它类型的数据库解决方案采取的“一个尺码满足一切需求”的方式意味着你要么就牺牲一些性能,要么你就用几个小时甚至几天的时间详细调整你的数据库。使用 MySQL,我们仅需要修改我们使用的存储引擎就可以了 --百度百科
总的来说,存储引擎是数据组织数据的方式,不同的存储引擎,能够满足不同的业务需求,同时存在不同方面的性能差异,选择合适的存储引擎对于不同的数据的存储要求提供一种合适的存储策略,对于数据的操作来说,是事半功倍的。

Mysql 的常用的存储引擎及特点

通过终端命令:SHOW ENGINES \G 我们可以查看数据库支持的存储引擎,Mysql5.6 支持 9 种存储引擎,如下查询结果,通过表格组织。

mysql> SHOW ENGINES \G
*************************** 1. row ***************************
      Engine: FEDERATED                       存储引擎名                
     Support: NO                              数据库是否支持此引擎  
     Comment: Federated MySQL storage engine  简介
Transactions: NULL                            事务支持
          XA: NULL                            分布式事务
  Savepoints: NULL                       
*************************** 2. row ***************************
      Engine: MRG_MYISAM
     Support: YES
     Comment: Collection of identical MyISAM tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 3. row ***************************
      Engine: MyISAM
     Support: YES
     Comment: MyISAM storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 4. row ***************************
      Engine: BLACKHOLE
     Support: YES
     Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 5. row ***************************
      Engine: CSV
     Support: YES
     Comment: CSV storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 6. row ***************************
      Engine: MEMORY
     Support: YES
     Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 7. row ***************************
      Engine: ARCHIVE
     Support: YES
     Comment: Archive storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 8. row ***************************
      Engine: InnoDB
     Support: DEFAULT
     Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
          XA: YES
  Savepoints: YES
*************************** 9. row ***************************
      Engine: PERFORMANCE_SCHEMA
     Support: YES
     Comment: Performance Schema
Transactions: NO
          XA: NO
  Savepoints: NO

看到这么多,你肯能有点迷了,这么多存储引擎,到底该如何选择,到底有什么用。其实常用的就那么几种,最容易遇到(考到)的也就那么两三种。也许你除了 InnoDB 其他的都不知道那也没关系,因为在数据库的快速发展中,很多存储引擎支撑的业务,正在逐渐被某些数据库替代,这些引擎基本不会被用到,术业有专攻就是这个道理,目前的 Mysql 默认引擎是 InnoDB,InnoDB 特点是对事务的支持,各种索引结构的支持,而我们大多数的业务都离不开事务。

以下是集中存储引擎的简介:

摘自[百度百科]:
1、MyISAM:拥有较高的插入,查询速度,但不支持事务
2、InnoDB:5.5 版本后 Mysql 的默认数据库,事务型数据库的首选引擎,支持 ACID 事务,支持行级锁定
3、Memory:所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在 Mysql 重新启动时丢失
4、Merge :将一定数量的 MyISAM 表联合而成一个整体,在超大规模数据存储时很有用
5、Archive :非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive 拥有高效的插入速度,但其对查询的支持相对较差
6、Federated: 将不同的 Mysql 服务器联合起来,逻辑上组成一个完整的数据库。非常适合[分布式应用]
7、CSV: 逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个.CSV 文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV 存储引擎不支持索引。
8、BlackHole :黑洞引擎,写入的任何数据都会消失,一般用于记录 binlog 做复制的中继

InnoDB 与 MyISAM 存储引擎的比较

名称事务支持存储限制锁机制索引支持缓存支持数据压缩空间使用内存使用插入速度
InnoDB支持64T行锁B树/Hash/集群数据/索引支持
MyISAM不支持不限表锁B树/全文检索索引不支持
以上两种是Mysql最常用的存储引擎,特点也很明显,MyISAM不支持事务,那么他就不支持并发的Update,但是它支持高负载的查询,他的表锁支持他的并发插入。还有一个特点是它支持全文检索。like %xxx%这种操作是十分耗时的,而且性能低下。而全文检索就可以一用来支持高效模糊匹配。

指定存储引擎 < 操作 >

在创建表的时候可以指定存储引擎,在 test 数据库中创建 tetsuser 和 testuser2 两个表如下:

USE test;

CREATE TABLE `testuser` (
  `oId` INT(10) NOT NULL,
  `username` INT(11) NOT NULL,
  `userage` INT(11) NOT NULL,
  PRIMARY KEY (`oId`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

CREATE TABLE `testuser2` (
  `oId` VARCHAR(10) NOT NULL,
  `username` INT(11) NOT NULL,
  `userage` INT(11) NOT NULL,
  PRIMARY KEY (`oId`)
) ENGINE=MYISAM DEFAULT CHARSET=utf8;

查看表信息:

mysql> SHOW  TABLE   STATUS  FROM  test  WHERE  NAME="testuser" \G
mysql> SHOW  TABLE   STATUS  FROM  test  WHERE  NAME="testuser2" \G
*************************** 1. row ***************************2.row**************************
           Name: testuser                            testuser2
         Engine: InnoDB                              MyISAM
        Version: 10                                  10
     Row_format: Compact                             Dynamic
           Rows: 0                                   0
 Avg_row_length: 0                                   0 
    Data_length: 16384                               0  
Max_data_length: 0                                   281474976710655
   Index_length: 0                                   1024
      Data_free: 0                                   0
 Auto_increment: NULL                                NULL
    Create_time: 2017-09-21 11:07:35
    Update_time: NULL
     Check_time: NULL
      Collation: utf8_general_ci
       Checksum: NULL
 Create_options:
        Comment:

从上面的表状态可以稍微的了解到不同存储引擎所带来的差别,具体的差异,可以通过测试,进行验证...这里就略过...

  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    330 引用 • 614 回帖
  • 存储
    21 引用 • 28 回帖 • 1 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    675 引用 • 535 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
rzx
此生最怕深情被辜负,最怕兄弟成陌路。对世界充满善意,同时又充满深深的恨意,我渴望天降甘霖福泽众生,又渴望灭世洪水重创世纪。 广州