当前位置: 首页 > 面试题库 >

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

唐和洽
2023-03-14
问题内容

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

表格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的,但我希望你能揭示一些什么光 ,你 会在我的处境做。


问题答案:

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



 类似资料:
  • 问题内容: 有人告诉我,InnoDB比MyISAM好得多。因此,当我创建表时,是否应该 始终 尝试使用InnoDB Engine而不是MyISAM?还是两者都有很大的好处? 问题答案: 是无事务的并且是堆组织的。记录由表中的行偏移量标识,索引将此偏移量存储为行指针。 支持交易并按索引组织。记录由的值标识(或未定义隐藏的内部列),并存储在中。二级索引将的值存储为行指针。 涉及全表扫描或二级索引查找的

  • 本文向大家介绍MySQL数据库修复方法(MyISAM/InnoDB),包括了MySQL数据库修复方法(MyISAM/InnoDB)的使用技巧和注意事项,需要的朋友参考一下 在网上找了篇MySQL的技术文章,感觉不错,把它翻译过来共享下。   原文作者:Mike Peters   我整理了7条修复MySQL数据库的方法,当简单的重启对数据库不起作用,或者有表崩溃时。   简单的MySQL重启:  

  • 本文向大家介绍MySQL数据库MyISAM存储引擎转为Innodb的方法,包括了MySQL数据库MyISAM存储引擎转为Innodb的方法的使用技巧和注意事项,需要的朋友参考一下 mysql数据库存储引擎为MyISAM的时候,在大访问量的情况下数据表有可能会出现被锁的情况,这就会导致用户连接网站时超时而返回502,此时就需要MySQL数据库MyISAM存储引擎转为Innodb。 步骤如下: 1、

  • 问题内容: 在为数据库(例如MySQL)设计模式时,会出现一个问题,即是否要完全规范化表。 一方面,联接(以及外键约束等)非常慢,另一方面,您会获得冗余数据和潜在的不一致情况。 这里“最优化”是正确的方法吗?即创建一个书本归一化数据库,然后查看可以进行归一化以实现最佳速度增益的内容。 对于这种方法,我的担心是,我将选择一个可能不够快的数据库设计- 但是在那个阶段重构模式(同时支持现有数据)将非常痛

  • 问题内容: 您是否建议使用日期时间或时间戳字段?为什么(使用MySQL)? 我正在服务器端使用PHP。 问题答案: MySQL中的时间戳通常用于跟踪记录的更改,并且通常在每次更改记录时进行更新。如果要存储特定值,则应使用datetime字段。 如果您想在使用UNIX时间戳还是本机MySQL日期时间字段之间做出选择,请采用本机格式。您可以通过这种方式在MySQL中进行计算, 并且如果要使用PHP对记

  • 本文向大家介绍MySQL数据库表修复 MyISAM,包括了MySQL数据库表修复 MyISAM的使用技巧和注意事项,需要的朋友参考一下 一:MySQL中MyISAM表损坏原因总结: 1、 服务器突然断电导致数据文件损坏;强制关机,没有先关闭mysql 服务;mysqld 进程在写表时被杀掉。 2、 磁盘损坏。 3、 服务器死机。 4、 mysql 本身的bug 。 二:MySQL中MyISAM表损