【问题标题】:Should I use MyISAM or InnoDB Tables for my MySQL Database?我应该为我的 MySQL 数据库使用 MyISAM 还是 InnoDB 表?
【发布时间】:2011-11-21 12:12:20
【问题描述】:

我的数据库中有以下两个表(索引完整,因为它将基于我使用的引擎):

表 1:

CREATE TABLE `primary_images` (
  `imgId` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `imgTitle` varchar(255) DEFAULT NULL,
  `view` varchar(45) DEFAULT NULL,
  `secondary` enum('true','false') NOT NULL DEFAULT 'false',
  `imgURL` varchar(255) DEFAULT NULL,
  `imgWidth` smallint(6) DEFAULT NULL,
  `imgHeight` smallint(6) DEFAULT NULL,
  `imgDate` datetime DEFAULT NULL,
  `imgClass` enum('jeans','t-shirts','shoes','dress_shirts') DEFAULT NULL,
  `imgFamily` enum('boss','lacoste','tr') DEFAULT NULL,
  `imgGender` enum('mens','womens') NOT NULL DEFAULT 'mens',
  PRIMARY KEY (`imgId`),
  UNIQUE KEY `imgDate` (`imgDate`)
)

表 2:

CREATE TABLE `secondary_images` (
  `imgId` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
  `primaryId` smallint(6) unsigned DEFAULT NULL,
  `view` varchar(45) DEFAULT NULL,
  `imgURL` varchar(255) DEFAULT NULL,
  `imgWidth` smallint(6) DEFAULT NULL,
  `imgHeight` smallint(6) DEFAULT NULL,
  `imgDate` datetime DEFAULT NULL,
  PRIMARY KEY (`imgId`),
  UNIQUE KEY `imgDate` (`imgDate`)
)

表 1 将用于创建一个缩略图库,其中包含指向更大版本图像的链接。 imgClassimgFamilyimgGender 将优化显示的缩略图。

表 2 包含与表 1 中的图像相关的图像。因此使用primaryId 将表 1 中的单个图像与表 2 中的一个或多个图像相关联。这就是我正在考虑使用 InnoDB 的外键功能,但我也熟悉 MyISAM 中索引的功能。

无需过多研究其余字段,imgDate 用于对结果进行排序。

最后但并非最不重要的一点是,我应该提到这个数据库是只读的。所有数据将由我输入。有人告诉我,如果数据库是只读的,那么它应该是 MyISAM,但我希望您能了解在我的情况下会做什么。

【问题讨论】:

  • 这个问题引起争论...应该迁移到程序员...???
  • @IAbstract - 你谈到了我不知道的事情,但如果你能详细说明,我会很高兴...
  • Programmers.StackExchange.com 比 StackOverflow 更主观。提出问题的方式将引发关于哪个更好的辩论……而且,通常这些问题已经结束。但是由于程序员现在存在并且允许在问题中进行更多的主观性,似乎更适合......恕我直言。

标签: mysql database database-design innodb myisam


【解决方案1】:

始终默认使用 InnoDB。

在 MySQL 5.1 以后,你应该使用 InnoDB。在 MySQL 5.1 中,您应该enable the InnoDB plugin。在 MySQL 5.5 中,InnoDB 插件默认启用,因此只需使用它。

多年前的建议是,MyISAM 在许多情况下都更快。但是,如果您使用的是当前版本的 MySQL,那就不再适用了。

在某些特殊的极端情况下,MyISAM 在某些工作负载(例如表扫描或仅插入的大容量工作)上的性能稍好一些,但默认选择应该是 InnoDB,除非你可以证明 em> 你有一个案例,MyISAM 做得更好。

InnoDB除了通常提到的对事务和外键的支持之外的优势还包括:

  • InnoDB 比 MyISAM 更能抵抗表损坏。
  • 行级锁定。在 MyISAM 中,读者会阻止作者,反之亦然。
  • 支持数据和索引的大型缓冲池。 MyISAM 密钥缓冲区仅用于索引。
  • MyISAM 停滞不前;所有未来的开发都将在 InnoDB 中进行。

另见我对MyISAM versus InnoDB的回复

【讨论】:

  • 我不需要 FULLTEXT 索引(据我了解)。但是您如何看待 Emil Vikström 所说的?我将不会使用 InnoDB 在写作方面提供的好处?就像我说的,查询都将是 read 查询,所以使用 MyISAM 不是更快吗?或者它有很大的不同?
  • 另外,您认为在我的情况下使用外键是否有益?或者你认为因为我主要是阅读而不是写作,外键不会有太大的不同?或者他们甚至是相关的?
  • 在我看来,速度和外键问题是次要的;当您的服务器您的应用程序崩溃时,您不希望您的表损坏。这排除了 MyISAM。
【解决方案2】:

需要考虑的几点:

  1. 您需要交易支持吗?
  2. 您会使用外键吗?
  3. 一张桌子上会写很多字吗?

如果这些问题的答案是“是”,那么您绝对应该使用 InnoDB。 否则,您应该回答以下问题:

  1. 您的桌子有多大?
  2. 它们包含多少行?
  3. 您的数据库引擎的负载是多少?
  4. 您希望运行什么样的查询?

除非您的表非常大并且您希望数据库负载很大,否则任何一个都可以正常工作。

我更喜欢 MyISAM,因为它可以很好地适应各种数据大小和负载。

【讨论】:

  • 很高兴再次见到你,回答我的另一个问题。回答你的问题:我需要了解更多关于事务支持的信息,然后才能说出我是否需要它。关心你简要告诉我它是什么?我认为外键有助于连接表格。不会对表进行写入,保存我自己将要插入数据的操作。因此写入速度不是问题。我的表格永远不会超过 1000 行;可能永远不会超过 500 个。我将执行几个不同的查询。将它们包括在上面会有帮助吗?
【解决方案3】:

MyISAM 不会让您进行 mysql 级别检查。例如,如果您想将两个表上的 imgId 更新为单个事务:

START TRANSACTION;
UPDATE primary_images SET imgId=2 WHERE imgId=1;
UPDATE secondary_images SET imgId=2 WHERE imgId=1;
COMMIT;

另一个缺点是完整性检查,使用 InnoDB 您可以进行一些错误检查,例如避免字段 UNIQUE KEY imgDate (imgDate) 中的重复值。相信我,这真的来了,而且更不容易出错。在我看来,MyISAM 是用来玩的,而一些更严肃的工作应该依赖 InnoDB。

希望对你有帮助

【讨论】:

    【解决方案4】:

    我想补充一些人们可能会从中受益的内容: 我刚刚创建了一个 InnoDB 表(将所有内容保留为默认值,除了将排序规则更改为 Unicode),并用大约 300,000 条记录(行)填充它。

    SELECT COUNT(id) FROM table 这样的查询 - 会挂起,直到给出错误消息,而不返回结果;

    我已将包含数据的表克隆到一个新的 MyISAM 表中 - 同样的查询以及其他大型 SELECTqueries 会快速返回,并且一切正常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-20
      • 2011-05-29
      • 2010-12-30
      • 1970-01-01
      • 2010-12-10
      • 2011-04-10
      • 2011-04-24
      • 1970-01-01
      相关资源
      最近更新 更多