我正在使用MySQL作为我的当前Web项目的数据库。 我是MySQL的新手。 请向我解释一下InnoDB和MyISAM的区别。
ISAM =索引顺序访问方法,本质上是一个平面文件(对于那些可以记住的DBA来说,可以认为是Btrieve或者B-Tree)。 这是一个非常古老的技术 – 但不要让它使用它。 因为它是一个平面文件(稍后更多),它不是关系型的,因此不是一个RDBMS,因此在某些情况下更合适。
InnoDB是像您最熟悉的完整RDBMS。 MyISAM可以通过在顶部添加的另一个层来保持链接,逻辑和参照完整性。
如果你有很多logging(如2000万),那么ISAM是非常棒的,logging大多是独立的(也就是说,你不需要做很多链接来检索相关的数据)。 它非常依赖于索引,如果你没有正确的索引,为非常长的查询时间做好准备。 例子:我们有一个带有20M +logging的Btrieve ISAM表,并且基于精确索引进行检索和过滤数据几乎是即时的。 使用错误的索引是15分钟。
如果你有很多的关系链接,InnoDB非常适合。 表A引用了表B中的一个字段,引用表C和D.InnoDB可以使用各种不错的join方法(散列连接等)来获取这些logging,而ISAM数据库将不得不为每一个单独运行多个子查询行并手动匹配logging。
如果你想要比这更详细的信息,你将不得不在数据库中做一个课程!
最根本的是InnoDB是事务性的。 MyIsam不是。 MyIsam通常要快一点,所以如果你不需要交易,这通常是你最好的select。 有关详细说明,您应该阅读MySQL文档。
现在除非你使用一个表格来logging日志风格的数据(更多的INSERT,然后是SELECT,没有事务),InnoDB通常更快,更可靠,更多的function等等。
MyISAM唯一的特点就是全文search,这对于基本的使用来说是很好的,但是大多数人使用一些来自Lucene的东西。
无论哪种方式,你必须调整MySQL的默认设置为32MB奔腾与其他服务共享。
有点晚了…但是这里有一个我写了几个月后相当全面的post ,详细介绍了MYISAM和InnoDB之间的主要区别。 抓一杯(也许是一个cookies),享受。
MyISAM和InnoDB的主要区别在于参照完整性和交易。 还有其他的区别,如locking,回滚和全文search。
引用完整性可确保表之间的关系保持一致。 更具体地说,这意味着当表(例如,列表)具有指向不同表(例如产品)的外键(例如产品ID)时,当指向表发生更新或删除时,这些改变被级联到链接表。 在我们的例子中,如果产品被重命名,链接表的外键也会更新; 如果产品从“产品”表中删除,则任何指向已删除条目的列表也将被删除。 此外,任何新的列表必须具有指向有效的现有条目的外键。
InnoDB是一个关系数据库pipe理系统(RDBMS),因此具有参照完整性,而MyISAM则没有。
使用数据操作语言(DML)语句(如SELECT,INSERT,UPDATE和DELETE)来pipe理表中的数据。 一个事务组将两个或更多的DML语句合并成一个单一的工作单元,因此整个单元都被应用,或者它们都不是。
MyISAM不支持事务,而InnoDB则支持事务。
如果在使用MyISAM表时操作中断,操作立即中止,即使操作没有完成,受影响的行(甚至每行内的数据)仍然受到影响。
如果一个操作在使用InnoDB表时被中断,因为它使用具有primefaces性的事务,任何没有完成的事务都不会生效,因为没有提交。
当一个查询运行在MyISAM表上时,它所查询的整个表将被locking。 这意味着后续查询只能在当前查询完成后执行。 如果您正在阅读大型表格和/或频繁进行读取和写入操作,则这可能意味着查询积压。
当查询针对InnoDB表运行时,只有涉及的行被locking,表的其余部分仍然可用于CRUD操作。 这意味着查询可以在同一个表上同时运行,只要它们不使用同一行。
InnoDB中的这个特性被称为并发性。 与并发性一样,存在一个主要的缺点,即适用于选定范围的表,因为在内核线程之间切换会有开销,并且应该对内核线程设置限制以防止服务器停止。
当你在MyISAM中运行一个操作时,这些改变就被设置了。 在InnoDB中,这些更改可以回滚。 用于控制事务的最常用命令是COMMIT,ROLLBACK和SAVEPOINT。 1. COMMIT – 你可以编写多个DML操作,但只有在提交COMMIT时才会保存更改2. ROLLBACK – 你可以放弃尚未提交的任何操作3. SAVEPOINT – 在列表中设置一个点ROLLBACK操作可以回滚到的操作
MyISAM不提供数据完整性 – 硬件故障,不清洁的关机和取消的操作可能导致数据损坏。 这将需要完全修复或重build索引和表格。
另一方面,InnoDB使用事务日志,双写缓冲区和自动校验和validation来防止损坏。 在InnoDB进行任何更改之前,它将事务之前的数据logging到名为ibdata1的系统表空间文件中。 如果发生崩溃,InnoDB将通过重播这些日志来自动恢复。
InnoDB直到MySQL版本5.6.4才支持FULLTEXT索引。 在撰写本文时,许多共享主机提供商的MySQL版本仍然低于5.6.4,这意味着InnoDB表不支持FULLTEXT索引。
但是,这不是使用MyISAM的有效理由。 最好转换为支持最新版本MySQL的主机提供商。 不是说使用FULLTEXT索引的MyISAM表不能被转换成InnoDB表。
总之,InnoDB应该是你select的默认存储引擎。 在满足特定需求时selectMyISAM或其他数据types。
通常,经验法则是,如果你想要速度,使用MyISAM,如果你想稳定,使用InnoDB。 如果我没有记错的话,可以使用primefaces性。