MySQL 存储引擎的选择

MySQL 的存储引擎种类很多,有MyISAM、InnoDB、Archive、Blackhole、CSV、Memory、Merge、NDB等等,以下介绍常用的存储引擎:

一、MyISAM:

  在MySQL 5.1 及之前的版本,MyISAM 是默认的存储引擎。MyISAM 提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM  不支持事务、不支持外键、不支持行级锁(仅支持 表级锁)。特点是访问速度快,对事务完整性没有要求。以select、insert为主的应用基本上都可以用这个引擎来创建表。MyISAM类型的表可能会损坏,原因可能是多种多样的。可以通过check table 语句检查MyISAM表的健康,并用repair table 语句修复一个损坏的MyISAM 表。

  MyISAM 表磁盘上存储成3 个文件,其中文件名和表名相同,但扩展名分别是:

.frm(存储表定义)
.MYD(MyData,存储数据)
.MYI(MyIndex,存储索引)

  MyISAM 表还支持3 种不同的存储格式,分别是:    

    1. 静态(固定长度)表:长度固定,优点是存储非常迅速,容易缓存,出现故障时容易恢复;缺点是占用的空间通常比动态表多;

    2. 动态表:记录长度不固定,这样存储的优点是占用的空间相对小,但是频繁的更新和删除记录会产生碎片,需要定时执行

    optimize table 语句或myisamch-r 命令来改善性能。出现故障时恢复相对困难;

    3. 压缩表:占用非常小的磁盘空间,因为每个记录都是被单独压缩的,所以只有非常小的访问开支。

  MyISAM 特性是:

    1. 加锁与并发:对整张表加锁,而不是针对行。读取时会对需要读到的所有表加共享锁,写入时则对表加排他锁。但是在表有读取

    查询的同时,也可以往表中插入新的记录(这被称为并发插入,Concurrent Insert);

    2. 为保证效率,不支持事务处理;

    3. count(*) 时效率高,不用遍历全表,原因是该引擎会记录行数;

    4. 非聚簇索引,支持全文索引,索引数据和表数据分开存储;

 

二、InnoDB: 

  MySQL 5.5之后默认的事务型引擎修改为InnoDB。它被设计用来处理大量的短期事务,短事务大部分情况是正常提交的,很少会被回滚。它是事务安全的,具有提交、回滚和崩溃恢复能力。InnoDB 表默认为行级锁,是基于聚簇索引建立的。聚簇索引对主键查询有很高的性能。不过它的二级索引中必须包含主键列,所以如果主键列很大的话,其他的索引都会很大。存储格式是平台独立的,可以将数据和索引文件复制到其他平台。

  InnoDB 存储方式:

    1. 使用共享表空间存储,这种创建的表,表结构数据保存在.frm 文件中,数据和索引数据保存在innodb_data_home_dir 和 innodb_data_file_path定义的表中间,可以是多个文件;

    2. 使用多表空间存储,这种方式创建的表,表结构数据仍然存在.frm 文件中,但是每个表的数据和索引单独保存在.ibd 中,如果是个分区表,则每个分区对应单独的.ibd 中,文件名是“表名+分区名”,可以在创建分区的时候指定每个分区的数据文件位置,以此来将表的IO均匀分布在多个磁盘中;

  InnoDB 特性是:

    1. 事务安全;

    2. 行级锁,为承受高并发增加了竞争力;

    3. count(*) 时效率低,遍历表一计算数量;

    4. 聚簇索引,主键默认为聚簇索引,没有主键时以第一列为聚簇索引,普通索引指向聚簇索引;

    5. 主持主键、外键;

 

三、指定引擎: 

1create table mytable (name varchar(32)) engine=InnoDB;
2alter table mytable engine = MyISAM;

 

posted @ 2019-03-03 13:42  吴wuwu  阅读(1197)  评论(0编辑  收藏  举报