mysql数据库引擎innodb的主索引文件和表文件分开吗

mysql数据库引擎innodb的主索引文件和表文件分开吗,第1张

不分开,因为InnoDB表数据文件本身就是主索引,MyISAM引擎是分开的。

MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。

而InnoDB是聚集索引,就是索引文件节点中就包含了完整的数据记录。

MyISAM不会被淘汰,MyISAM和InnoDB两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁。而MyISAM不支持所以MyISAM往往就容易被人认为只适合在小项目中使用。

作为使用MySQL的用户角度出发,Innodb和MyISAM都是比较喜欢的,如果数据库平台要达到需求:999%的稳定性,方便的扩展性和高可用性来说的话,MyISAM绝对是首选。

原因如下:

1、平台上承载的大部分项目是读多写少的项目,而MyISAM的读性能是比Innodb强不少。

2、MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成Innodb比MyISAM体积庞大不小。

3、经常隔1,2个月就会发生应用开发人员不小心update一个表where写的范围不对,导致这个表没法正常用,这个时候MyISAM随便从当天拷贝的压缩包取出对应表的文件,随便放到一个数据库目录下,然后dump成sql再导回到主库,并把对应的binlog补上。如果是Innodb,恐怕不可能有这么快速度,最小的一个数据库实例的数据量基本都是几十G大小。

4、从接触的应用逻辑来说,select count() 和order by 是最频繁的,大概能占了整个sql总语句的60%以上的 *** 作,而这种 *** 作Innodb其实也是会锁表的,很多人以为Innodb是行级锁,那个只是where对主键是有效,非主键的都会锁全表。

5、还有就是经常有很多应用部门需要定期某些表的数据,MyISAM的话很方便,只要发对应那表的frmMYD,MYI的文件,在对应版本的数据库启动就行,而Innodb就需要导出xxxsql了,因为光给别人文件,受字典数据文件的影响,对方是无法使用的。

6、如果和MyISAM比insert写 *** 作的话,Innodb还达不到MyISAM的写性能,如果是针对基于索引的update *** 作,虽然MyISAM可能会逊色Innodb,但是那么高并发的写,从库能否追的上也是一个问题,还不如通过多实例分库分表架构来解决。

7、如果是用MyISAM的话,merge引擎可以大大加快应用部门的开发速度,只要对这个merge表做一些select count() *** 作,非常适合大项目总量约几亿的rows某一类型(如日志,调查统计)的业务表。

InnoDB表损坏

InnoDB拥有内部恢复机制,假如数据库崩溃了,InnoDB通过从最后一个时间戳开始运行日志文件,来尝试修复数据库。

大多数情况下会修复成功,而且整个过程是透明的。

假如InnoDB自行修复失败,那么数据库将不能启动。

在继续 *** 作前,先浏览下MySQL的日志文件,确定数据库是因为InnoDB表的损坏而崩溃。

有一种方法是更新InnoDB的日志文件计数器以跳过引起崩溃的查询,这种情况下,将造成数据的不一致性而且会经常使主从复制中断。

一旦确定MySQL因为InnoDB表损坏无法启动时,就可以按照以下5步进行修复:

1添加如下配置到/etc/mycnf文件中

innodb_force_recovery = 4

2这时就可以重新启动数据库了,在innodb_force_recovery配置的作用,所有的插入与更新 *** 作将被忽略;

3导出所有的数据表;

4关闭数据库并删除所有数据表文件及目录,再运行 mysql_install_db来创建MySQL默认数据表;

5在/etc/mycnf中删除innodb_force_recovery这一行,再启动MySQL(这时MySQL正常启动);

6从第3步备份的文件中恢复所有的数据。

基本的差别为:

MyISAM类型不支持事务处理, MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。这样就可以根据数据表不同的用处是用不同的存储类型。

另外,MyISAM类型的二进制数据文件可以在不同 *** 作系统中迁移。也就是可以直接从Windows系统拷贝到linux系统中使用。

InnoDB 是 MySQL 上第一个提供外键约束的引擎,除了提供事务处理外,InnoDB 还支持行锁,提供和 Oracle 一样的一致性的不加锁读取,能增加并发读的用户数量并提高性能,不会增加锁的数量。

InnoDB 的设计目标是处理大容量数据时最大化性能,它的 CPU 利用率是其他所有基于磁盘的关系数据库引擎中最有效率的。

InnoDB 是一套放在 MySQL 后台的完整数据库系统,InnoDB 有它自己的缓冲池,能缓冲数据和索引,InnoDB 还把数据和索引存放在表空间里面,可能包含好几个文件,这和 MyISAM 表完全不同,在 MyISAM 中,表被存放在单独的文件中,InnoDB 表的大小只受限于 *** 作系统文件的大小,一般为 2GB。

MyIASM是IASM表的新版本,有如下扩展:

二进制层次的可移植性。

NULL列索引。

对变长行比ISAM表有更少的碎片。

支持大文件。

更好的索引压缩。

更好的键吗统计分布。

更好和更快的auto_increment处理。

以下是一些细节和具体实现的差别:

1InnoDB不支持FULLTEXT类型的索引。

2InnoDB 中不保存表的具体行数,也就是说,执行select count() from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含 where条件时,两种表的 *** 作是一样的。

3对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。

4DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。

5LOAD TABLE FROM MASTER *** 作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。

另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”

任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。

1 研究结论

1)InnoDB占用磁盘空间比MyISAM大,MyISAM存储数据可节省空间12%,存储索引可节省95%;

2)InnoDB对空闲存储空间的使用不优。

研究发现,MyISAM可大量节省磁盘空间,特别是对索引的存储上,优势巨大,这对大型Mysql数据库的数据表和索引的物理设计,具有较大的指导意义。

2 研究对象及获得的数据

Mysql版本:5126-rc-community

研究对象为创建的一个表,mytable3,初始为InnoDB类型。有54万行非重复数据(用随机函数产生),两个索引。

从实验数据可以看出,表类型alter为MyISAM后,所占磁盘空间仅8MB,为InnoDB的4%。而且随着表类型改回InnoDB,InnoDB表空间被迫扩充120MB,达到1034MB,以支持该表数据的回迁。

mysql-51版本之前默认引擎是MyISAM,之后是innoDB。

MyISAM是非集聚引擎,支持全文索引;不支持事务;它是表级锁;会保存表的具体行数。innoDB是集聚引擎,56以后才有全文索引;支持事务;它是行级锁;不会保存表的具体行数。一般:不用事务的时候,count计算多的时候适合myisam引擎。对可靠性要求高就是用innodby引擎。

MySQL有9种存储引擎,不同的引擎,适合不同的场景,我们最常用的,可能就是InnoDB,应该是从55开始,就成为了MySQL的默认存储引擎。InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,InnoDB是默认的MySQL引擎。

以上就是关于mysql数据库引擎innodb的主索引文件和表文件分开吗全部的内容,包括:mysql数据库引擎innodb的主索引文件和表文件分开吗、mysql5.5的默认存储引擎是innodb,是不是myisam引擎要被淘汰了、怎样修复损坏了的innodb 表等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9476136.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存