mysql支撑存储引擎有好几种,我们这里重要讨论一下经常使用的几种存储引擎。Innodb,myisam
INNODB
INNODB索引完成
与 MyISAM雷同的一点是,InnoDB 也采纳 B+Tree这类数据构造来完成 B-Tree索引。而很大的区分在于,InnoDB 存储引擎采纳“群集索引”的数据存储体式格局完成B-Tree索引,所谓“群集”,就是指数据行和相邻的键值紧凑地存储在一同,注重 InnoDB 只能群集一个叶子页(16K)的纪录(即群集索引满足肯定的局限的纪录),因而包含相邻键值的纪录可能会相距甚远。
在 InnoDB 中,表被称为 索引组织表(index organized table),InnoDB 根据主键组织一颗 B+Tree (假如没有主键,则会挑选一个唯一的而且非空索引替换,假如没有如许的索引,InnoDB则会隐式地定义一个主键来作为群集索引),同时叶子页中寄存整张表的行纪录数据,也能够将群集索引的叶子节点称为数据页,非叶子页能够看作是叶子页的希罕索引。
下图说清楚明了 InnoDB群集索引的完成体式格局,同时也表现了一张 innoDB表的构造,能够看到,InnoDB 中,主键索引和数据是一体的,没有离开。
这类完成体式格局,赋予了 InnoDB 按主键检索的超高机能。能够有目标性地挑选群集索引,比方一个邮件表,能够挑选用户ID来群集数据,如许只须要从磁盘读取较少而且一连的数据页就可以取得某个id的用户悉数的邮件,避免了读取分散页时所消耗的随机I/O。
InnoDB 则是 I/O 操纵,Innodb读写采纳MVCC来支撑高并发。
全表扫描
当InnoDB做全表扫描时并不高效,由于 InnoDB 实际上并没有递次读取,在大多情况下是在随机读取。做全表扫描时,InnoDB 会按主键递次扫描页面和行。这应用于一切的InnoDB 表,包含碎片化的表。假如主键页表没有碎片(存储主键和行的页表),全表扫描是相称快,由于读取递次靠近物理存储递次。然则当主键页有碎片时,该扫描就会变得非常迟缓
行级锁
供应行锁(locking on row level),供应与 Oracle 范例一致的不加锁读取(non-locking read in SELECTs),别的,InnoDB表的行锁也不是相对的,假如在实行一个SQL语句时MySQL不能确定要扫描的局限,InnoDB表一样会锁全表,比方
update table set num=1 where name like “%aaa%”
MYISAM
MyISAM索引的完成
每一个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字最先,扩展名指出文件范例。MyISAM索引文件【.MYI (MYIndex)】和数据文件【.MYD (MYData)】是星散的,索引文件仅保留纪录地点页的指针(物理位置),经由过程这些地点来读取页,进而读取被索引的行。先来看看构造图
上图很好地说清楚明了树中叶子保留的是对应行的物理位置。经由过程该值,存储引擎能顺遂地举行回表查询,获得一行完全纪录。同时,每一个叶子页也保留了指向下一个叶子页的指针。从而轻易叶子节点的局限遍历。 而关于二级索引,在 MyISAM存储引擎中以与上图一样的体式格局完成,这也说清楚明了 MyISAM的索引体式格局是“非群集的”,与 Innodb的“群集索引”形成了对照
MyISAM 默许会把索引读入内存,直接在内存中操纵;
表级锁
小结:Innodb强调多功用性,支撑的拓展功用比较多,myisam重要侧重于机能
区分
1、InnoDB支撑事件,MyISAM不支撑,关于InnoDB每一条SQL言语都默许封装成事件,自动提交,如许会影响速率,所以最好把多条SQL言语放在begin和commit之间,构成一个事件;
2、InnoDB是群集索引,数据文件是和索引绑在一同的,必须要有主键,经由过程主键索引效力很高。然则辅佐索引须要两次查询,先查询到主键,然后再经由过程主键查询到数据。因而,主键不应该过大,由于主键太大,其他索引也都邑很大。而MyISAM黑白群集索引,数据文件是星散的,索引保留的是数据文件的指针。主键索引和辅佐索引是自力的。
3、InnoDB不保留表的细致行数,实行select count(*) from table时须要全表扫描。而MyISAM用一个变量保留了全部表的行数,实行上述语句时只须要读出该变量即可,速率很快;
4、Innodb不支撑全文索引,而MyISAM支撑全文索引,查询效力上MyISAM要高;
以上就是mysql存储引擎区分有哪些的细致内容,更多请关注ki4网别的相干文章!