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

ste*_*ail 11 mysql database database-design myisam innodb

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

表格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`)
)
Run Code Online (Sandbox Code Playgroud)

表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`)
)
Run Code Online (Sandbox Code Playgroud)

表1将用于创建一个缩略图库,其中包含指向较大版本图像的链接.imgClass,imgFamily以及imgGender将细化显示缩略图.

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

如果不对剩余的字段进行太多研究,imgDate则用于对结果进行排序.

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

Bil*_*win 22

始终默认使用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的回答