mysql常用引擎

mysql存储引擎,类似我们看的视频的 avi.mp4等格式,客户都能看,只是占用空间和清晰度不一样。
mysql引擎也是一样,不同的引擎占用空间与读取性能等可能有区别。
mysql常用引擎:MyISAM、InnoDB

MyISAM(mysql5.5.5以前是默认,以后就是InnoDB)

在mysql客户端中,使用以下命令可以查看MySQL支持的引擎。

mysql> show engines;

MyISAM表是独立于操作系统的,这说明可以轻松地将其从Windows服务器移植到Linux服务器;每当我们建立一个MyISAM引擎的表时,就会在本地磁盘上建立三个文件,文件名就是表明。例如,我建立了一个MyISAM引擎的tb_Demo表,那么就会生成以下三个文件:

1.tb_demo.frm,存储表定义;
2.tb_demo.MYD,存储数据;
3.tb_demo.MYI,存储索引。

MyISAM表无法处理事务,这就意味着有事务处理需求的表,不能使用MyISAM存储引擎。MyISAM存储引擎特别适合在以下几种情况下使用:

1.选择密集型的表。MyISAM存储引擎在筛选大量数据时非常迅速,这是它最突出的优点。
2.插入密集型的表。MyISAM的并发插入特性允许同时选择和插入数据。例如:MyISAM存储引擎很适合管理邮件或Web服务器日志数据。
mysql系统的表大部分用的是MyISAM引擎
MyISAM 是缓存索引,不是缓存数据,读取速度快,占用资源少,不支持外键约束,但支持全文索引
适合的生产场景:
1、不需要支持事务,
2、一般读数据或者写数据比较多的网站。读写都多的不适合
3、数据修改相对较少(阻塞问题)
4、对数据性一致性不高的业务

调优:
1、设置合适的索引(缓存机制)
2、调整读写优先级,根据实际需求确保重要操作更优先执行
3、启用延迟插入改善大批量写入性能(降低写入频率,尽可能多条数据一次性写入)
4、尽量顺序操作让insert 数据都写入到尾部,减少阻塞
5、分解大的操作,降低单个操作的阻塞时间
6、降低并发数(减少对mysql的访问),某些高并发场景通过应用进行排队队列机制Q队列
7、对于相对静态(更改不频繁)的数据库数据,充分利用Query Cache或redis缓存服务可以极大的提高效率
query_cache_size=2M
query_cache_limit=1M
query_cache_min_res_unit=2k
8、MyISAM的Count只有在全表扫描的时候特别高效,带有其他条件的count都需要进行实际的数据访问

InnoDB

InnoDB是一个健壮的事务型存储引擎,这种存储引擎已经被很多互联网公司使用,为用户操作非常大的数据存储提供了一个强大的解决方案。我的电脑上安装的MySQL5.6.13版,InnoDB就是作为默认的存储引擎。InnoDB还引入了行级锁定和外键约束,在以下场合下,使用InnoDB是最理想的选择:

1.更新密集的表。InnoDB存储引擎特别适合处理多重并发的更新请求。
2.事务。InnoDB存储引擎是支持事务的标准MySQL存储引擎。
3.自动灾难恢复。与其它存储引擎不同,InnoDB表能够自动从灾难中恢复。
4.外键约束。MySQL支持外键的存储引擎只有InnoDB。
5.支持自动增加列AUTO_INCREMENT属性。

特点:
1、支持事务:支持4个事务隔离级别,
2、行级锁定(更新时一般锁定当前行),通过索引实现,全表扫描任然回事表锁,注意间隙锁的影响
3、读写阻塞与事务隔离级别相关
4、具有非常高效的缓存特性,能缓存索引,也能缓存数据
5、整个表和主键以Cluster方式存储,组成一颗平衡树
6、所有Secondary Index 都会保存主键信息。
7、支持分区,表空间,类似oracle数据库
8、支持外键约束,5.5以前不支持全文索引,以后版本支持了
9、对机器硬件要求高
10、相对于MyISAM引擎,InnoDB引擎更消耗资源,速度没有MyISAM快

生产场景:
1、需要事务支持的业务
2、行级锁定对高并发有很好的适应能力,当时需要确保查询时通过索引完成的
3、读写和更新都较为频繁的场景,如BBS,SNS,微博,微信等
4、数据一致性要求比较高的场景,如:充值转账,银行转账业务
一般来说,如果需要事务支持,并且有较高的并发读取频率,InnoDB是不错的选择。
5、硬件内存配置较大。可以很好的利用InnoDB较好的缓存能力来提高内存利用率,尽可能减少IO

调优:
1、主键尽可能小,避免给Seconddary index 带来过大的空间负担
2、避免全表扫描,因为会使用表锁。
3、尽可能的缓存所有d额索引和数据,提高响应速度,减少磁盘IO消耗
4、在大批量小插入的时候,尽量自己控制事务而不要使用autocommit自动提交,有开关可以控制提交方式
5、合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性
如果innodb_flush_log_at_trx_commitdd的值为0,log buffer每秒就会刷写日志到磁盘,提交事务的时候不要做任何操作。
6、避免主键更新,因为这会带来大量的数据移动。
区别:

更换引擎:
用mysqldump将数据导出来,然后用sed将备份语句中的引擎名字替换,然后导回去即可

  1. MyISAM InnoDB
    构成上的区别:
    每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。 .frm文件存储表定义。
    数据文件的扩展名为.MYD (MYData)。 索引文件的扩展名是.MYI (MYIndex)。
    基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB

    事务处理上方面:
    MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持
    InnoDB提供事务支持事务,外部键(foreign key)等高级数据库功能 SELECT
    UPDATE,INSERT,Delete操作 如果执行大量的SELECT,MyISAM是更好的选择
    1.如果你的数据执行大量的INSERT 或 UPDATE,出于性能方面的考虑,应该使用InnoDB表 2.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。 3.LOAD TABLE FROM
    MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用
    对AUTO_INCREMENT的操作 每表一个AUTO_INCREMEN列的内部处理。 MyISAM 为 INSERT
    和 UPDATE
    操作自动更新这一列。这使得AUTO_INCREMENT列更快(至少10%)。在序列顶的值被删除之后就不能再利用。(当AUTO_INCREMENT列被定义为多列索引的最后一列,可以出现重使用从序列顶部删除的值的情况)。
    AUTO_INCREMENT值可用ALTER TABLE或myisamch来重置
    对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引
    更好和更快的auto_increment处理
    如果你为一个表指定AUTO_INCREMENT列,在数据词典里的InnoDB表句柄包含一个名为自动增长计数器的计数器,它被用在为该列赋新值。
    自动增长计数器仅被存储在主内存中,而不是存在磁盘上 关于该计算器的算法实现,请参考 AUTO_INCREMENT 列在 InnoDB
    里如何工作 表的具体行数 select count(*) from
    table,MyISAM只要简单的读出保存好的行数,注意的是,当count(*)语句包含 where条件时,两种表的操作是一样的
    InnoDB 中不保存表的具体行数,也就是说,执行select count(*) from
    table时,InnoDB要扫描一遍整个表来计算有多少行 锁 表锁 提供行锁(locking on row
    level),提供与 Oracle 类型一致的不加锁读取(non-locking read in
    SELECTs),另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,
    例如update table set num=1 where name like “�a%”

猜你喜欢

转载自blog.csdn.net/qq_25611295/article/details/78961768
今日推荐