Mysql存储引擎

    |     2017年8月31日   |   数据库   |     0 条评论   |    1203

通常说的数据库,就是数据的集合:磁盘上的一些文件,或内存里的一批数据。我们常说的 MySQL、SQL Server,其实是数据库管理系统,负责存储,并提供查询和更新。

MySQL 是开源的关系型数据库,支持 SQL、子查询、存储过程、触发器、视图、索引、事务、锁、外键约束和影像复制等。它和 Oracle、SQL Server 一样是客户/服务器系统,并且是单进程多线程架构。一个重要特点是支持插入式存储引擎。

一、什么是存储引擎

关系库里的表是用来存储和组织信息的数据结构,可以理解成由行和列组成的表格,类似 Excel。有的表简单,有的复杂;有的根本不存长期数据;有的读很快但插入很差。实际开发需要各种各样的表,处理方式也不一样。

存储引擎说白了就是:如何存数据、如何建索引、如何更新和查询。因为数据以表的形式存放,存储引擎也可以叫表类型。Oracle、SQL Server 通常只有一种存储引擎;MySQL 提供多种,用户可以按表选引擎,也可以自己写引擎。

二、MySQL 有哪些存储引擎

常见的有 MyISAM、InnoDB、MEMORY、MERGE 等。客户端里可以用 show engines; 查看当前支持的引擎。

1. MyISAM

MyISAM 表独立于操作系统,可以从 Windows 服务器轻松移植到 Linux。每建一张 MyISAM 表,本地磁盘会生成三个以表名为名的文件。例如表 tb_Demo:

  • tb_demo.frm,存储表定义
  • tb_demo.MYD,存储数据
  • tb_demo.MYI,存储索引

MyISAM 不能处理事务,有事务需求的表不要用它。它特别适合:

  • 选择密集型的表:筛选大量数据时非常迅速,这是最突出的优点。
  • 插入密集型的表:并发插入允许同时选择和插入数据。例如管理邮件或 Web 服务器日志。

2. InnoDB

InnoDB 是健壮的事务型存储引擎,很多互联网公司用它扛很大的数据量。MySQL 5.7.11 起它就是默认引擎。它还引入了行级锁定和外键约束。适合:

  • 更新密集的表:适合多重并发更新。
  • 事务:支持事务的标准 MySQL 存储引擎。
  • 自动灾难恢复:能从灾难中自动恢复。
  • 外键约束:MySQL 支持外键的存储引擎只有 InnoDB。
  • 支持自动增加列 AUTO_INCREMENT。

一般来说,需要事务、又有较高并发读取,InnoDB 是不错的选择。

对比 MyISAM InnoDB
事务 不支持 支持
锁 表级为主 行级锁定
外键 不支持 支持(MySQL 中仅此引擎)
磁盘文件 .frm / .MYD / .MYI 表空间管理
适用 选择/插入密集,如日志 更新密集、要事务与并发读

三、常用操作

1. 查看默认存储引擎

mysql> SHOW variables like 'default_storage_engine';
+------------------------+--------+
| Variable_name          | Value  |
+------------------------+--------+
| default_storage_engine | InnoDB |
+------------------------+--------+

2. 显示当前库支持的所有存储引擎

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       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+

3. 修改默认引擎

改配置文件 my.ini(MySQL 5.7)里的 default-storage-engine。

MySQL 5.1 以后,INFORMATION_SCHEMA 里有 ENGINES 表,信息和 show engines; 一样。查哪些引擎支持事务:

select engine from information_schema.engines where transactions = 'yes';

一句话总结:MySQL 按表选存储引擎;要事务、行锁和外键用 InnoDB,只读筛选或日志类插入用 MyISAM。

转载请注明来源:Mysql存储引擎
本文链接地址:https://ai.zhousir.top/?p=2144
回复 取消