什么时候应该选择在MySQL中使用InnoDB?

时间:2009-07-04 13:18:59

标签: mysql innodb

我对受伤害的人here感到困惑。

我知道怎么做,见下文,但不明白为什么?它们用于什么?

create table orders (order_no int not null auto_increment, FK_cust_no int not null, 
foreign key(FK_cust_no) references customer(cust_no), primary key(order_no)) type=InnoDB;


create table orders (order_no int not null auto_increment, FK_cust_no int not null, 
foreign key(FK_cust_no) references customer(cust_no), primary key(order_no));

10 个答案:

答案 0 :(得分:17)

InnoDB是storage engine in MySQL。它们中有不少,它们各有利弊。 InnoDB的最大优势是:

  • 支持交易(支持ACID属性)。
  • 行级锁定。与MyISAM相比,拥有更细粒度的锁定机制可以提供更高的并发性。
  • 外键约束。允许您让数据库确保数据库状态的完整性以及表之间的关系。

答案 1 :(得分:12)

始终。除非您需要使用MySQL的全文搜索,否则在您的共享虚拟主机中禁用InnoDB。

答案 2 :(得分:3)

我认为您对两个不同的问题感到困惑,何时使用InnoDB而不是MyISAM,以及何时使用外键(FK)约束。

至于第一期,有很多答案可以很好地解释MyISAM和InnoDB之间的差异。我只想重申一下,在tvanfosson的文章引用中,MyISAM更适合用于大多数读取的系统。这是因为它使用表级锁定而不是像InnoDB那样的行级别,因此MyISAM也不能处理高并发性,加上它缺少有助于数据完整性的功能,例如事务和外键(再次,已经被其他人提及)。

您不必在数据模型中使用FK约束。如果您知道表之间的关系是什么,并且您的应用程序没有错误,那么您将在没有FK的情况下顺利完成。 但是,使用FK可以在数据库层为您提供额外的保险,因为MySQL不会让您的应用程序根据您创建的约束插入错误的数据。

如果您不清楚为什么要使用主键(PK),那么创建id_order之类的列,例如orders表的PK就意味着MySQL不会让你INSERT id_order的值不止一次,因为PK列中的每一行都必须是唯一的。

FK将用于对另一个表具有依赖性的表,例如,order_items将依赖于orders(下面)。 id_order_itemsorder_items的PK,您可以id_order_items orders表的FK,以建立ordersorder_items之间的一对多关系{1}}。同样,id_item可以是order_items表中的FK和items表中的PK,以建立order_items和{{1}之间的一对多关系}。

**然后,FK约束的作用是阻止您添加items order_items id_item value to thetable that isn't in the id_order_items table, or from adding a订单to order_items`表

所有FK所做的就是确保数据的完整性,它还有助于将您的表之间的关系传达给未编写系统的其他开发人员(以及几个月后您忘记了!),但主要是数据完整性。* *

额外信用:那么为什么要使用交易?那么你已经提到了一个引用它说它们对银行系统很有用的说法,但它们在更多的情况下是有用的。

基本上,在关系数据库中,特别是如果它是normalized,例如添加订单,更新订单或删除订单等常规操作通常会触及多个表和/或涉及多个SQL声明。您甚至可以多次触摸同一个表(如下例所示)。 Btw数据操作语言(DML)语句(that isn't in the / INSERT / UPDATE)一次只涉及一个表。

添加订单的示例:

我建议使用DELETE表和orders表。这样就可以在order_items表中的id_order上设置PK,这意味着orders无法重复id_order。如果没有1对多orders - orders关系,则必须在order_items表中为每个与其关联的多个项目的订单设置多行(您需要一个这个电子商务系统的orders表也是如此。此示例将添加一个订单,并使用4个不同的items语句触摸2个表。

(没有关键限制用于说明目的)

INSERT

那么,如果插入#1 插入#2 查询成功运行,但 insert#3 语句没有?您最终会得到一个缺少项目的订单,这将是垃圾数据。如果在这种情况下,您想要回滚所有查询,那么数据库处于添加订单之前的状态,然后重新开始,这正是交易的用途。 **您将要求所有这些查询完成的查询组合在一起,或者在异常的情况下,然后根本不将这些查询组合到一个事务中。

与PK / FK约束一样,事务有助于确保数据完整性。**

答案 3 :(得分:3)

<强> InnoDB的:

MySQL中的InnoDB存储引擎。   InnoDB是MySQL的高可靠性和高性能存储引擎。 InnoDB的主要优势包括:

  • 其设计遵循ACID模型,具有提交,回滚和崩溃恢复功能的事务,以保护用户数据。
  • 行级锁定(不升级到较粗粒度锁)和Oracle风格的一致性读取可提高多用户并发性和性能。
  • InnoDB表将您的数据排列在磁盘上,以优化基于主键的常见查询。每个InnoDB表都有一个称为聚簇索引的主键索引,用于组织数据以最大限度地减少主键查找的I / O
  • 为了保持数据完整性,InnoDB还支持FOREIGN KEY参照完整性约束。
  • 您可以将InnoDB表与其他MySQL存储引擎中的表自由混合,即使在同一语句中也是如此。例如,您可以使用连接操作在单个查询中组合InnoDB和MEMORY表中的数据。

InnoDB限制:

  • 没有全文索引(低于5.6 mysql版本)

  • 无法快速压缩,只读

更多详情:

请参阅此link

答案 4 :(得分:2)

在您的示例中,您将创建外键。外键仅支持InnoDB表,而不支持MyISAM表。

答案 5 :(得分:2)

您可能对Database Journal中的this article感兴趣,后者讨论了MySQL中的InnoDB表类型。

摘录:

  

上个月我们查看了HEAP表   type,一个完全运行的表类型   在记忆中。本月我们来看看   设置InnoDB表类型,   最感兴趣的类型   用户。标准的MyISAM表类型   是网站使用的理想选择   与...相比,有许多读数   写道,没有交易。哪里   这些条件不适用(和   除了网站,他们不适用   经常在数据库世界里)   InnoDB表很可能是表   选择的类型。本文的目的是   在熟悉MySQL的用户,   但只使用了默认的MyISAM   表类型。

我不会被另一个问题推迟。保持对数据库的任何类型的适当备份 - 并且不要意外丢弃表;-) - 并且无论您选择哪种表类型都可以。

答案 6 :(得分:1)

到处!弃用myisam,innodb是要走的路。不仅仅是性能,还有数据完整性和酸交易。

答案 7 :(得分:1)

总的来说,最重要的一点是InnoDB提供了每行锁定,而MyISAM确实可以查看每个表。在有大量写入的大表上,这可能会产生很大的性能问题。

另一方面,MyISAM表具有更简单的文件结构,在文件级复制和修复表更容易。

答案 8 :(得分:1)

注释具有将数据库转换为InnoDB here.

的命令

答案 9 :(得分:0)

Machineknoopx关于交易的答案的补充:

  

默认的MySQL   表类型,MyISAM,不支持   交易。 BerkeleyDB和 InnoDB   是事务安全表类型   在开源MySQL中可用,   版本3.23.34及更高版本。

交易的定义和银行业务示例

  

交易是一系列的   个人数据库操作   被组合在一起。 - 一个好的   交易有用的例子   在银行业。

Source of the citations