MySQL中InnoDB和MyISAM的存储引擎区别

MySQL数据库区别于其他数据库的很重要的一个特点就是其插件式的表存储引擎,其基于表,而不是数据库。由于每个存储引擎都有其特点,因此我们可以针对每一张表来挑选最合适的存储引擎。 作为DBA,我们应该深刻的认识存储引擎。今天介绍两种最常见的存储引擎和它们的区别:InnoDB和MyISAM。 InnoDB存储引擎InnoDB存储引擎支持事务,其设计目标主要就是面向OLTP(On Line Transaction Processing 在线事务处理)的应用。特点为行锁设计、支持外键,并支持非锁定读。从5.5.8版本开始,InnoDB成为了MySQL的默认存储引擎。 InnoDB存储引擎采用聚集索引(clustered)的方式来存储数据,因此每个表都是按照主键的顺序进行存放,如果没有指定主键,InnoDB会为每行自动生成一个6字节的ROWID作为主键。 MyISAM存储引擎MyISAM存储引擎不支持事务、表锁设计,支持全文索引,主要面向OLAP(On Line Analytical Processing 联机分析处理)应用,适用于数据仓库等查询频繁的场景。在5.5.8版本之前,MyISAM是MySQL的默认存储引擎。该引擎代表着对海量数据进行查询和分析的需求。它强调性能,因此在查询的执行速度比InnoDB更快。 MyISAM存储引擎还有一个特点是只缓存索引文件,而不缓存数据文件,这点非常独特。 InnoDB和MyISAM的区别事务为了数据库操作的原子性,我们需要事务。保证一组操作要么都成功,要么都失败,比如转账的功能。我们通常将多条SQL语句放在begin和commit之间,组成一个事务。 InnoDB支持,MyISAM不支持。 主键由于InnoDB的聚集索引,其如果没有指定主键,就会自动生成主键。MyISAM支持没有主键的表存在。 外键为了解决复杂逻辑的依赖,我们需要外键。比如高考成绩的录入,必须归属于某位同学,我们就需要高考成绩数据库里有准考证号的外键。 InnoDB支持,MyISAM不支持。 索引为了优化查询的速度,进行排序和匹配查找,我们需要索引。比如所有人的姓名从a-z首字母进行顺序存储,当我们查找zhangsan或者第44位的时候就可以很快的定位到我们想要的位置进行查找。 InnoDB是聚集索引,数据和主键的聚集索引绑定在一起,通过主键索引效率很高。如果通过其他列的辅助索引来进行查找,需要先查找到聚集索引,再查询到所有数据,需要两次查询。 MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据的指针。 从InnoDB 1.2.x版本,MySQL5.6版本后,两者都支持全文索引。 auto_increment对于自增数的字段,InnoDB要求必须有只有该字段的索引。但MyISAM可以将该字段与其他字段组成联合索引。 表行数很常见的需求是看表中有多少条数据,此时我们需要select count(*) from table_name。 InnoDB不保存表行数,需要进行全表扫描。MyISAM用一个变量保存,直接读取该值,更快。当时当带有where查询的时候,两者一样。 存储数据库的文件都是需要在磁盘中进行存储,当应用需要时再读取到内存中。一般包含数据文件、索引文件。 InnoDB分为: .frm表结构文件.ibdata1共享表空间.ibd表独占空间.redo日志文件MyISAM分为三个文件: .frm存储表定义.MYD存储表数据.MYI存储表索引执行速度如果你的操作是大量的查询操作,如SELECT,使用MyISAM性能会更好。如果大部分是删除和更改的操作,使用InnoDB。 delete调用delete from table时,MyISAM会直接重建表,InnoDB会一行一行的删除,但是可以用truncate table代替。参考: mysql清空表数据的两种方式和区别。 锁MyISAM仅支持表锁,每次操作锁定整张表。InnoDB支持行锁,每次操作锁住最小数量的行数据。 表锁相比于行锁消耗的资源更少,且不会出现死锁,但同时并发性能差。行锁消耗更多的资源,速度较慢,且可能发生死锁,但是因为锁定的粒度小、数据少,并发性能好。如果InnoDB的一条语句无法确定要扫描的范围,也会锁定整张表。 当行锁发生死锁的时候,会计算每个事务影响的行数,然后回滚行数较少的事务。 数据恢复MyISAM崩溃后无法快速的安全恢复。InnoDB有一套完善的恢复机制。 数据缓存MyISAM仅缓存索引数据,通过索引查询数据。InnoDB不仅缓存索引数据,同时缓存数据信息,将数据按页读取到缓存池,按LRU(Latest Rare Use 最近最少使用)算法来进行更新。 如何选择存储引擎创建表的语句都是相同的,只有最后的type来指定存储引擎。 MyISAM大量查询总count查询频繁,插入不频繁没有事务操作InnoDB需要高可用性,或者需要事务表更新频繁参考资料MySQL InnoDB索引原理和算法:https://segmentfault.com/a/11...《MySQL技术内幕 InnoDB存储引擎》 1.3节mysql清空表数据的两种方式和区别:https://segmentfault.com/a/11...Mysql 中 MyISAM 和 InnoDB 的区别有哪些?:https://www.zhihu.com/questio...MySQL存储引擎MyISAM与InnoDB区别总结整理:https://blog.csdn.net/xlgen15...MySQL InnoDB的存储文件:https://blog.csdn.net/chenjia...

July 9, 2019 · 1 min · jiezi

MySQL存储引擎概览

查看mysql版本mysql> select version();+------------+| version() |+------------+| 5.6.32-log |+------------+1 row in set (0.00 sec)或者:mysql> status;--------------mysql Ver 14.14 Distrib 5.6.32, for Win32 (AMD64)Connection id: 9Current database:Current user: root@localhostSSL: Not in useUsing delimiter: ;Server version: 5.6.32-log MySQL Community Server (GPL)Protocol version: 10Connection: localhost via TCP/IPServer characterset: latin1Db characterset: latin1Client characterset: gbkConn. characterset: gbkTCP port: 3307Uptime: 4 hours 7 min 11 secThreads: 4 Questions: 126 Slow queries: 0 Opens: 73 Flush tables: 1 Open tables: 66 Queries per second avg: 0.008查看MySQL存储引擎show enginesEngineSupportCommentTransactionsXASavepointsMyISAMYESMyISAM storage engineNONONOMRG_MYISAMYESCollection of identical MyISAM tablesNONONOCSVYESCSV storage engineNONONOBLACKHOLEYES/dev/null storage engine (anything you write to it disappears)NONONOMEMORYYESHash based, stored in memory, useful for temporary tablesNONONOFEDERATEDNOFederated MySQL storage engine(NULL)(NULL)(NULL)ARCHIVEYESArchive storage engineNONONOInnoDBDEFAULTSupports transactions, row-level locking, and foreign keysYESYESYESPERFORMANCE_SCHEMAYESPerformance SchemaNONONOSupport:DEFAULT表示MYSQL数据库默认的存储引擎,其它存储引擎就是你可以选择的。 如上表,InnoDB是默认的存储引擎 ...

July 8, 2019 · 1 min · jiezi

mysql利用表对象数据文件恢复数据

数据库文件基础.frm文件: 只存储表的结构信息,frm文件跟数据库存储引擎无关,这也就是说,它和表的索引、数据都无关。MyISAM引擎.myd文件: 数据文件.myi文件:索引文件Innodb引擎ib_logfile0和ib_logfile1:重做日志文件,两个文件一模一样,之所以存在两个是,为了避免一个文件损坏后,而且MySQL crash之后,innodb无法恢复数据。ibdata1:数据文件根据《MySQL技术内幕》一书的介绍,innodb存在表空间的概念,是以共享表空间的格式,将数据都存入到一个文件中。介绍ibdata1,ibdata1是与存储引擎相关的,只在innodb存储引擎下出现,而且是mysql-server中所有innodb存储引擎的表,不分数据库都存储到ibdata1中,当然这个文件中还会存储其他信息,如索引等。当在MySQL中开启innodb_file_per_table后,那么将会在每个数据库对应的文件夹下,每张表将有存在两个对应文件,一个是.frm,另外一个是.ibd文件。这种情况成为私有表空间。但是这个时候共享表空间ibdata1,仍然是存在的。使用数据库文件恢复数据yum安装的mysql,数据目录是/var/lib/mysql,可以通过/etc/my.cnf查看。 MyISAM引擎表恢复数据直接备份.frm,.myd,.myi文件,然后再复制粘贴到目标数据库文件夹即可。 Innodb引擎表恢复数据如果是系统表空间的情况,一个笨办法就是建立一个新的mysql环境,将旧环境中的ibdata1文件和需要恢复的aa,bb等数据库文件夹复制到新mysql数据目录。然后重启mysqld守护进程就行。 systemctl restart mysqld下面是恢复的rbac数据库user表的数据 如果是私有表空间的话,虽然没实验过,但我猜想,直接复制.frm文件和.ibd文件到目标数据库即可。 参考文章利用数据库文件恢复MySQL数据

May 26, 2019 · 1 min · jiezi