发布网友 发布时间:2022-03-27 05:15
共3个回答
懂视网 时间:2022-03-27 09:36
myisam和innodb的区别如下:
1、InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务。
2、InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败。
3、InnoDB是聚集索引,使用B加Tree作为索引结构,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。
热心网友 时间:2022-03-27 06:44
MYISAM 表是典型的数据与索引分离存储,主键和二级索引没有本质区别。比如在 MYISAM 表里主键、唯一索引是一样的,没有本质区别。
INNODB 表本身是索引组织表,也就是说索引就是数据。下图表T1的数据行以聚簇索引的方式展示,非叶子节点保存了主键的值,叶子节点保存了主键的值以及对应的数据行,并且每个页有分别指向前后两页的指针。
INNODB 表不同于 MYISAM,INNODB 表有自己的数据页管理,默认 16KB。MYISAM 表数据的管理依赖文件系统,比如文件系统一般默认 4KB,MYISAM的块大小也是 4KB,MYISAM 表的没有自己的一套崩溃恢复机制,全部依赖于文件系统。
INNODB 表这样设计的优点有两个:
数据按照主键顺序存储。主键的顺序也就是记录行的物理顺序,相比指向数据行指针的存放方式,避免了再次排序。我们知道,排序消耗最大。
2. 两个叶子节点分别含有指向前后两个节点的指针,这样在插入新行或者进行页*时,只需要移动对应的指针即可。
INNODB 二级索引的非叶子节点保存索引的字段值,上图索引为表 t1 的字段 age。叶子节点含有索引字段值和对应的主键值。
这样做的优点是当出现数据行移动或者数据页*时,避免二级索引不必要的维护工作。当数据需要更新的时候,二级索引不需要重建,只需要修改聚簇索引即可。
但是也有缺点:
1. 二级索引由于同时保存了主键值,体积会变大。特别是主键设计不合理的时候,比如用 UUID 做主键。
2. 对二级索引的检索需要检索两次索引树。第一次通过检索二级索引叶子节点,找到过滤行对应的主键值;第二次通过这个主键的值去聚簇索引中查找对应的行。
热心网友 时间:2022-03-27 08:02
mysql中的索引是在存储引擎中实现的 ,mysql有很多存储引擎 但是大部分都采用B+tree作为索引结构的 其中包括myisam和innodb。
myisam索引文件和数据文件是分离的,myisam索引的存储方式是非聚合的,索引文件存储在MYI文件。
innodb 索引和数据文件是保存在一起的;数据共享的话会放在ibdata,独享的话会放在ibd
innodb每个表只有一个聚集索引。如果木有主键,则会选择一个非空唯一索引来代替主键;如果再不存在则会定义一个隐藏的主键进行聚集。
所谓聚集和非聚集:
非聚集索引叶子页包含一个指向表中的记录的指针地址,记录的物理顺序和索引的顺序不一致;
聚集索引则数据行和键值一起保存在叶子页 而且记录的排列顺序与索引的排列顺序一致。