一尘不染

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

mysql

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

表格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将用于创建缩略图库,其中包含指向较大版本图像的链接。imgClass,,imgFamilyimgGender将优化显示的缩略图。

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

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

最后但并非最不重要的一点,我应该提到此数据库是 READ ONLY
。所有数据将由我输入。有人告诉我,如果只读取数据库,它应该是MyISAM的,但我希望你能揭示一些什么光 ,你 会在我的处境做。


阅读 368

收藏
2020-05-17

共1个答案

一尘不染

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

2020-05-17