繁体   English   中英

我应该为我的MySQL数据库使用MyISAM或InnoDB表吗?

[英]Should I use MyISAM or InnoDB Tables for my MySQL Database?

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

表格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剩余的字段进行过多研究, imgDate将用于对结果进行排序。

最后,但并非最不重要的,我应该提到这个数据库是READ ONLY 所有数据都将由我输入。 有人告诉我,如果数据库是只读的,它应该是MyISAM,但我希望你能说明在我的情况下会做些什么。

始终默认使用InnoDB。

在MySQL 5.1之后,你应该使用InnoDB。 在MySQL 5.1中,您应该启用InnoDB插件 在MySQL 5.5中,InnoDB插件默认启用,所以只需使用它即可。

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

可能存在一些奇异的极端情况,其中MyISAM对某些工作负载(例如表扫描或仅大量INSERT工作)执行得更好,但默认选择应该是InnoDB,除非您能证明您有一个MyISAM做得更好的情况。

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

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

另请参阅我对MyISAM与InnoDB的回答

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 imgDateimgDate )中的重复值。 相信我,这真的来了,并且不那么容易出错。 在我看来,MyISAM是为了玩游戏,而一些更严肃的工作应该依赖于InnoDB。

希望能帮助到你

需要考虑的一些事项:

  1. 你需要交易支持吗?
  2. 你会使用外键吗?
  3. 桌子上会写很多东西吗?

如果回答任何这些问题是“是”,那么你一定要使用InnoDB。 否则,您应该回答以下问题:

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

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

我更喜欢MyISAM,因为它适用于各种数据大小和负载。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM