在MySQL中何时选择使用InnoDB引擎?

15
我对这里的伤害感到相当困惑。
我知道如何做,见下文,但不知道为什么?它们有什么作用?
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));

1
你的例子在做外键,而不是InnoDB。你应该先问一下外键的作用。 - J-16 SDiZ
1
“伤害炒作”是什么意思?那篇文章是关于如何从意外的DROP DATABASE中恢复的。 - Jim Ferrans
Jim Ferrans:我提到了这句话:“如果你不是一个经验丰富的程序员,你会感到困难。” - Léo Léopold Hertz 준영
@J-16 SDiZ:嗯...你有注意到第一个查询的结尾吗?:type=InnoDB - Andrew Ensley
10个回答

18

InnoDB是MySQL中的一种存储引擎。有很多种存储引擎,它们都有各自的优缺点。InnoDB最大的优势包括:

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

12

除非你需要使用MySQL的全文搜索功能或者你所使用的共享Web主机已禁用InnoDB,否则始终使用InnoDB引擎。


这是最简单的答案,而且它是真的! - JohnB
1
FYI,InnoDB现在支持全文搜索。此外,InnoDB比以前快得多。因此,几乎没有理由再使用MyISAM了(这就是为什么InnoDB现在是MySQL的默认引擎)。 - BlueRaja - Danny Pflughoeft

4

InnoDB:

MySQL中的InnoDB存储引擎。InnoDB是一种高可靠性和高性能的MySQL存储引擎,其主要优点包括:

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

InnoDB限制:

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

  • 不能进行压缩以实现快速只读

更多细节:

请参考这个链接


3
我认为您对两个不同问题感到困惑,一个是何时使用InnoDB而不是MyISAM,另一个是何时使用外键(FK)约束。
关于第一个问题,已经有许多答案很好地解释了MyISAM和InnoDB之间的区别。我只想重申一下,在tvanfosson从一篇文章中引用的话中,MyISAM更适合大多数读取系统。这是因为它使用表级锁定而不是像InnoDB那样的行级锁定,所以MyISAM不能像InnoDB那样处理高并发,并且缺少帮助数据完整性的功能,例如事务和外键(再次由其他人提到)。
您不必在数据模型中使用FK约束。如果您知道表之间的关系,并且您的应用程序没有错误,那么您可以很好地没有FK。然而,使用FK在数据库层面上为您提供了额外的保险,因为MySQL将根据您创建的约束条件阻止应用程序插入错误数据。
如果你不清楚为什么要使用主键(PK),那么让一个列,例如id_order成为orders表的主键意味着MySQL不会让你插入相同的id_order值超过一次,因为主键列中的每一行必须是唯一的。
外键(FK)将用于具有对另一个表的依赖关系的表上,例如,order_items将依赖于orders表(如下所示)。id_order_itemsorder_items的主键,你可以将id_order_items作为orders表的外键,以建立ordersorder_items之间的一对多关系。同样地,id_item可以是order_items表中的外键,也可以是items表中的主键,以建立order_itemsitems之间的一对多关系。
然后,外键约束的作用是防止你向order_items表中添加一个不在items表中的id_item值,或向orders表中添加一个不在order_items表中的id_order_items值。所有外键只是确保数据完整性,并帮助其他开发人员(以及几个月后忘记系统的自己)传达表之间的关系,但主要是为了数据完整性。
额外加分:那么为什么要使用事务?好吧,你已经提到了一句话,说它们对银行系统有用,但它们在更多情况下也很有用。
基本上,在关系型数据库中,特别是在标准化的情况下,常规操作(例如添加订单、更新订单或删除订单)通常会涉及多个表和/或多个SQL语句。甚至可能会多次触及同一张表(如下面的示例所示)。顺便说一下,数据操作语言(DML)语句(INSERT/UPDATE/DELETE)一次只涉及一张表。 添加订单的示例: 我建议使用一个orders表和一个order_items表。这样可以在orders表中具有id_order的主键,这意味着在orders中不能重复使用id_order。如果没有1对多的orders-order_items关系,那么每个与多个商品相关联的订单都需要在orders表中有多行 (此电子商务系统还需要一个items表)。这个例子将添加一个订单并使用4个不同的INSERT语句触及2个表。(仅作说明,无关键约束)
-- insert #1
INSERT INTO orders (id_order, id_order_items, id_customer)
VALUES (100, 150, 1)

-- insert #2
INSERT INTO order_items (id_order_items, id_item)
VALUES (4, 1)

-- insert #3
INSERT INTO order_items (id_order_items, id_item)
VALUES (4, 2)

-- insert #4
INSERT INTO order_items (id_order_items, id_item)
VALUES (4, 3)

那么如果插入 #1 和插入 #2 查询成功,但插入 #3 语句失败了呢?你最终会得到一个缺少项目的订单,那将是垃圾数据。在这种情况下,如果您想回滚所有查询,以便数据库与添加订单之前处于相同状态,然后重新开始,那么这正是事务的用途。您将要一起组合查询,要么全部完成,要么如果出现异常,则全部不完成,进入事务。
因此,像 PK/FK 约束一样,事务有助于确保数据完整性。

将innoDB与myIsam相对应加1,当我们不了解MySQL和innoDB时,我们就无法知道有许多引擎。 - pdem

2

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


2
您可能会对Database Journal上的这篇文章感兴趣,该文章讨论了MySQL中的InnoDB表类型。
摘录:
上个月我们看了HEAP表类型,这是一种完全运行在内存中的表类型。本月我们将介绍设置InnoDB表类型,这是最受重视用户关注的类型。标准的MyISAM表类型非常适合网站使用,在读取比写入多且没有事务的情况下。当这些条件不适用(除了网站,它们在数据库世界中并不经常适用)时,InnoDB表很可能成为首选的表类型。本文针对熟悉MySQL但仅使用默认MyISAM表类型的用户。
我不会因其他问题而放弃。正确备份您的数据库,无论选择哪种表类型都不要意外删除表;-),那么您就可以选择任何表类型了。

1
总的来说,对我来说最重要的一点是InnoDB提供按行锁定,而MyISAM则按表进行查找。在具有大量写入的大型表中,这可能会造成很大的性能问题。
另一方面,MyISAM表具有更简单的文件结构,复制和修复文件级别上的表格要容易得多。

多少算很多?每秒写一次算很多吗? - Evan Lee
@EvanLee 这取决于情况 :) 特别是你写入多少数据,以及写操作需要多长时间。但总的来说:不需要! - leo

1

一个评论有一个命令,可以将你的数据库转换为InnoDB 这里。


0

无处不在!弃用MyISAM,InnoDB才是正确的选择。这不仅涉及性能,还涉及数据完整性和ACID事务。


ACID事务并不总是必需的,因此在许多情况下MyISAM非常好。不同的问题有不同的解决方案。 - Nin

0

关于事务的补充说明,来自Machineknoopx的回答:

默认的MySQL表类型MyISAM不支持事务。BerkeleyDB和InnoDB是开源MySQL版本3.23.34及以上版本中可用的支持事务的表类型。

事务的定义和银行业务示例

事务是一系列被组合在一起的单个数据库操作。--一个很好的事务使用示例是在银行业务中。

引用来源


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接