-- 查看名命令 SHOW ENGINES; -- 查看当前的存储引擎 SHOW VARIABLES LIKE '%storage_engine%'
一、InnoDB存储引擎
-
-
InnoDB存储引擎为了在主内存中缓存数据和索引而维护它自己的缓冲池。InnoDB将它的表和索引存在一个逻辑表中,表空间可以包含数个文件
-
InnoDB支持外键完整性约束。创建表时,如果没有显形在表定义时指定主键,InnoDB会为每一行生成一个6B的ROWID,并以此为主键。
-
InnoDB不创建目录,使用InnoDB时,MySql将在MySQL数据目录下创建一个名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的
二、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适合存储归档数据如记录日志。