前言
本篇博客是MySQL的学习笔记,若文章中出现相关问题,请指出!
所有博客文件目录索引:博客目录索引(持续更新)
一、介绍存储引擎
1.1、InnoDB引擎
在MySQL5.5版本后,MySQL的默认内置存储引擎已经是InnoDB引擎了,主要特点如下:
支持事务,其默认事务级别为RR(Repeatable read,可重复读),通过MVCC(并发版本控制)实现。
使用锁粒度是行级锁,可以支持更高的并发。
支持外键。
在InnoDB中存在缓冲管理,通过缓冲池将索引和数据全部缓存起来,能够加快查询的速度。
对于InnoDB类型的表,其数据的物理组织形式是聚簇表,所以的数据按照主键来组织。数据和索引放在一块,位于B+树的叶子节点上。
1.2、MyISAM引擎
在5.5版本之前,MyISAM是MySQL的默认存储引擎,该存储引擎并发性差,不支持事务,使用的场景较少,特点如下:
不支持事务。
不支持外键,如果强行增加外键,不会提示错误,但是外键会无效。
对数据的查询缓存只会缓存索引,不会像InnoDB一样缓存数据,而是利用操作系统本身的缓存。
默认的锁粒度是表级锁,所以并发度很差,加锁快,锁冲突较少,所以不太容易出现死锁。
支持全文索引(5.6版本以后,InnoDB存储引擎也对全文索引做了支持),但是MySQL的全文索引基本不会使用,对于全文索引,现如今在Java层面有许多成熟的解决方案,如ElasticSearch,Solr,Sphinx。
数据库的主机如果宕机,MyISAM的数据文件容易损坏,而且难恢复。
二、InnoDB与MyISAM的对比
由于锁粒度不同,InnoDB比MyISAM支持更高的并发。
InnDB为行级锁,MyISAM为表级锁。InnoDB相对于MyISAM来说更容易发生死锁,锁冲突的概率大,而且上锁的开销更大,需要为每一行加锁。
在备份容灾上,InnoDB支持在线热备,有很成熟的在线热备解决方案。
热备:一般运行,数据能够一边备份。冷备:需要让它停止下来进行备份。
在查询性能上来看,MyISAM的查询效率高于InnoDB,因为InnoDB在查询过程中是需要维护数据缓存,而且查询过程中是先定位到行所在的数据块,然后再从数据块中定位到要找到的行;而MyISAM可以直接定位到数据所在的内存地址,可以直接找到数据。
查询表记录总数量(select count(*))上MyISAM比InnoDB能够更快的查询。如果行数在千万级别上,MyISAM可以快速查出,而InnoDB查询的特别慢,因为MyISAM将行数单独存储了,而InnoDB需要逐行去统计行数;如果使用InnoDB,并且频繁需要查询行数时,需要对行数进行特殊处理,例如:离线查询并缓存,在Java层面查询一次之后存储到Map对象里(存储到内存中)。
MyISAM与InnoDB的表数据文件各不相同。MyISAM有三个表文件:.frm(表结构定义)、.MYI(索引)、.MYD(数据);而InnoDB的表数据文件为:.idb(数据与缓存)和.frm(表结构)。
不同引擎的表文件如下:
①在InnoDB中,一个表一般由.ibd(数据及索引)以及.frm(存储表信息)组成,分别存放表结构以及表数据。
注意:MySQL8.0中没有.frm呢,直接存储到InnoDB引擎中去了。
②在MyISAM引擎中,一个表由三个文件组成.frm、.MYD(mydata)、.MYI(myindex)
三、不同的场景选择引擎
不同场景需求介绍:
根据场景是否需要事务支持?需要选择InnoDB。
是否需要支持高并发?需要选择InnoDB。
是否需要外键?需要选择InnoDB。
是否需要高效缓冲数据?InnoDB对数据与索引都做了缓冲,而MyISAM只缓冲了索引。
对于索引采用的数据结构选择?InnoDB选择B+树作为存储数据与索引。MyISAM则是选择哈希。
MyISAM应用场景:字典管理(不需要事务)、多查询。