当前位置: 首页 > 新闻中心 > mysql数据库的逻辑架构和存储引擎

mysql数据库的逻辑架构和存储引擎

发布时间:2024-02-11 6:47:46

  1. Mysql数据库3种存储引擎有什么区别?
  2. Mysql数据库3种存储引擎有什么区别?
  3. mysql存储引擎区别有哪些

一、Mysql数据库3种存储引擎有什么区别?

这个是考虑性能的问题,还有事务的支持,吧 百度一下你就知道

myisam、innodb、heap(memory)、ndb

貌似一般都是使用 innodb的,

mysql的存储引擎包括:myisam、innodb、bdb、memory、merge、example、ndbcluster、archive、csv、blackhole、federated等,其中innodb和bdb提供事务安全表,其他存储引擎都是非事务安全表。

最常使用的2种存储引擎:

1.myisam是mysql的默认存储引擎,当create创建新表时,未指定新表的存储引擎时,默认使用myisam。每个myisam在磁盘上存储成三个文件。文件名都和表名相同,扩展名分别是.frm(存储表定义)、.myd(mydata,存储数据)、.myi(myindex,存储索引)。数据文件和索引文件可以放置在不同的目录,平均分布io,获得更快的速度。

2.innodb存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比myisam的存储引擎,innodb写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。

不知道是不是对你有帮助

一、Mysql数据库3种存储引擎有什么区别?

聚集索引:也称 clustered index。是指关系表记录的物理顺序与索引的逻辑顺序相同。由于一张表只能按照一种物理顺序存放,一张表最多也只能存在一个聚集索引。与非聚集索引相比,聚集索引有着更快的检索速度。

mysql 里只有 innodb 表支持聚集索引,innodb 表数据本身就是聚集索引,也就是常说 iot,索引组织表。非叶子节点按照主键顺序存放,叶子节点存放主键以及对应的行记录。所以对 innodb 表进行全表顺序扫描会非常快。

非聚集索引:也叫 secondary index。指的是非叶子节点按照索引的键值顺序存放,叶子节点存放索引键值以及对应的主键键值。mysql 里除了 innodb 表主键外,其他的都是二级索引。myisam,memory 等引擎的表索引都是非聚集索引。简单点说,就是索引与行数据分开存储。一张表可以有多个二级索引。

三、mysql存储引擎区别有哪些

mysql中存储引擎的区别:以innodb和myisam为例,前者支持事务而后者不支持;前者强调多功能性,支持的拓展功能比较多,后者主要侧重于性能;前者不支持全文索引,而后者支持全文索引等

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要高;