首页 > 技术文章 > MySQL(一)- 数据库引擎

RobertLionLin 2019-08-26 10:08 原文

MySQL DBMS - MySQL Database Management System。数据库管理系统。

 

MySQL数据库引擎


ISAM (Indexed Sequential Access Method)


isam是一个存在时间较长的数据表格管理方法,被设计的时候就考虑到数据库被查询的次数要远远大于插入的次数,因此isam执行读取的操作很快,而且不占用大量的内存和存储资源。但是,isam也有两个比较致命不足,不支持事务,不能容错。如果硬盘崩溃了,数据无法恢复,因此在重要的程序中使用isam的时候,需要经常备份实时数据,通过其复制特性 ,MySQL能够支持这样的备份应用程序。

MyISAM

MyISAM 是 MySQL的 ISAM扩展格式(MySQL5.5之前版本是缺省数据库引擎)数据库引擎。除了提供ISAM里面没有的索引字段管理功能,还提供了表的锁定机制来优化并发的读写操作,其代价就是需要经常使用 optimize table 命令来恢复被机制所浪费的空间。工具有 修复数据库文件的 MyISAMCHK,恢复浪费空间的MyISAMPACK。不足:不支持事务;数据越多,写操作就会越慢(需要维护数据和索引信息)。
  如果使用该数据库引擎,会生成三个文件:
  .frm:表结构信息
  .MYD:数据文件
  .MYI:表的索引信息

InnoDB

InnoDB数据库引擎都是造就MySQL灵活性的技术的直接产品,这项技术就是MYSQL++ API。在使用MYSQL的时候,你所面对的每一个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理(transaction process)也不支持外键。尽管要比ISAM和MyISAM引擎慢很多.现在常用版本默认引擎。
  InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读。在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。
InnoDB存储它的表&索引在一个表空间中,表空间可以包含数个文件(或原始磁盘分区)。这与MyISAM表不同,比如在MyISAM表中每个表被存在分离的文件中。
在MySQL5.7版本中,InnoDB存储引擎管理的数据文件为两个:分别是frm,idb文件。
  InnoDB特点:
  1)、支持事务
  2)、数据多版本读取(InnoDB+MyISAM+ISAM)
  3)、锁定机制的改进
  4)、实现外键

innodb与myisam区别

1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin transaction和commit之间,组成一个事务;
  2. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
  3. InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
  4. InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快; MyISAM缓存有表meta-data(行数等);
  5. Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高;

如何选择

1. 是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM
  2. 如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读写也挺频繁,请使用InnoDB。
  3. 系统崩溃后,MyISAM恢复起来更困难,能否接受;
  4. MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差。

其他引擎

Memory、NDBCluster、CSV

存储引擎管理

查看数据库支持的存储引擎
  show engines
  查看数据库当前使用的存储引擎
  就是默认引擎是什么。
  show variables like '%storage_engine%'
  也可以在MySQL配置文件中查看。 windows - my.ini。 Linux - my.cnf
  查看数据库表所用的存储引擎
  show create table table_name
  创建表指定存储引擎
  create table table_name (column_name column_type) engine = engine_name
  修改表的存储引擎
  alter table table_name engine=engine_name
  修改默认的存储引擎
  在MySQL配置文件中修改下述内容:
  default-storage-engine=INNODB
  MySQL配置文件:
  windows系统 - MySQL安装目录/my.ini (5.7版本my.ini文件在数据目录中。 C:/programdata/MySQL Server 5.7/mysql/)
  linux系统 - /etc/my.cnf

 

推荐阅读