六、数据库存储引擎 一、InnoDB存储引擎 二、MyISAM存储引擎 三、MyISAM和InnoDB对比 四、存储引擎的选择

-- 查看名命令
SHOW ENGINES;
-- 查看当前的存储引擎
SHOW VARIABLES LIKE '%storage_engine%'
  • 具有提交回滚崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级别。

  • InnoDB存储引擎为了在主内存中缓存数据和索引而维护它自己的缓冲池。InnoDB将它的表和索引存在一个逻辑表中,表空间可以包含数个文件

  • InnoDB支持外键完整性约束。创建表时,如果没有显形在表定义时指定主键,InnoDB会为每一行生成一个6B的ROWID并以此为主键

  • InnoDB不创建目录,使用InnoDB时,MySql将在MySQL数据目录下创建一个名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件

六、数据库存储引擎
一、InnoDB存储引擎
二、MyISAM存储引擎
三、MyISAM和InnoDB对比
四、存储引擎的选择

二、MyISAM存储引擎

2.1、MyISAM的引擎特点

  • 不支持事务

  • 表级锁定

  • 读写相互阻塞

  • 只会缓存索引:

  • 读取速度快,占用资源相对少

  • 不支持外键约束,但是支持全文索引

2.2、MyISAM引擎的适用的生产场景

  • 不需要支持事务的业务(例如转账,付款就不行)

  • 一般为读数据比较多的应用,读写都频繁则不合适,会堵塞,读多或者写多单一性都可以.

  • 读写并发访问较少的业务(单独读或者单独写高并发可以,同时读写并发不行)(主要是锁定 机制问题,其实锁定整个表,会有堵塞问题)

  • 数据修改相对较少的业务.

  • 对数据一致性要求不是非常高的业务.

  • 硬件资源较差的机器可以使用MyISAM,一般为中小型网站.

2.3、MyISAM引擎调优精要

  • 设置合适的索引(缓存机制).

  • 调整读写优先级,根据实际需求确保重要操作更有限执行.

  • 启用延时插入(尽量批量插入,降低写的频率)

  • 尽量顺序操作,让insert数据都写入到尾部,减少阻塞.

  • 分解大的时间长的操作,降低单个操作的阻塞时间.

  • 降低并发数(减少对MySQL的访问),某些高并发的场景可以通过应用进行排队队列机制.

  • 对于静态(更改不频繁)的数据库数据,充分利用Query Cache或者memcached缓存服务极大可能的提高访问效率.

  • MyISAM的count只有在全表扫描的时候才是最高效的,带有条件的count都需要进行试机的数据访问

  • 也可以在做主从同步的时候主库使用InnoDB,从库使用MyISAM,进行读写分离(不推荐使用,数据迁移和升级比较麻烦)

  • 使用MyISAM引擎创建数据库,将生产3个文件。文件的名称以表的名字开始,扩展名支出文件类型:frm文件存储表定义,数据文件的扩展名为.MYD,索引文件的扩展名.MYI

三、MyISAM和InnoDB对比

对比项 MyISAM InnoDB
主外键 不支持 支持
事务 不支持 支持
行表锁 表锁,即使操作一条记录也会锁住整个表,不适合高并发的操作 行锁,操作时只锁某一行,不对其他行影响,适合高并发
缓存 只缓存索引,不缓存真实数据 不仅缓存索引,还缓存真实数据, 对内存要求极高,而且内存大小对性能有决定性影响。
表空间
关注点 性能 事务
默认安装 Y Y

四、存储引擎的选择

  • 如果要提供提交、回滚和崩溃恢复能力的事物安全能力,并要求实现并发控制,选择InnoDB。

  • 如果数据表主要用来插入和查询记录,则选择MyISAM。

  • 如果存放临时数据,数据量不大,且对数据安全性要求不高可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果。

  • 如果只有INSERT和SELECT操作,可以选择Archive引擎,Archive支持高并发的插入操作,但不是事物安全的,Archive适合存储归档数据如记录日志。