[英]Can i use some tables with InnoDB engine and some with MyIsam on my MySQL database?
[英]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将用于创建一个缩略图库,其中包含指向较大版本图像的链接。 imgClass
, imgFamily
和imgGender
将优化显示的缩略图。
表2包含与表1中相关的图像。因此,使用primaryId
将表1中的单个图像与表2中的一个或多个图像相关联。这是我在考虑使用InnoDB的外键功能的地方,但是我也熟悉MyISAM中索引的功能。
如果imgDate
剩余的字段进行过多研究, imgDate
将用于对结果进行排序。
最后,但并非最不重要的,我应该提到这个数据库是READ ONLY 。 所有数据都将由我输入。 有人告诉我,如果数据库是只读的,它应该是MyISAM,但我希望你能说明你在我的情况下会做些什么。
在MySQL 5.1之后,你应该使用InnoDB。 在MySQL 5.1中,您应该启用InnoDB插件 。 在MySQL 5.5中,InnoDB插件默认启用,所以只需使用它即可。
几年前的建议是MyISAM在许多情况下都更快。 但如果您使用当前版本的MySQL,则不再适用。
可能存在一些奇异的极端情况,其中MyISAM对某些工作负载(例如表扫描或仅大量INSERT工作)执行得更好,但默认选择应该是InnoDB,除非您能证明您有一个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 imgDate
( imgDate
)中的重复值。 相信我,这真的来了,并且不那么容易出错。 在我看来,MyISAM是为了玩游戏,而一些更严肃的工作应该依赖于InnoDB。
希望能帮助到你
需要考虑的一些事项:
如果回答任何这些问题是“是”,那么你一定要使用InnoDB。 否则,您应该回答以下问题:
除非您的表非常大并且您希望数据库负载很大,否则任何一个都可以正常工作。
我更喜欢MyISAM,因为它适用于各种数据大小和负载。
我想添加一些人们可能会从中受益的东西:我刚刚创建了一个InnoDB表(将所有内容保留为默认值,除了将排序规则更改为Unicode),并使用大约300,000条记录(行)填充它。
像SELECT COUNT(id) FROM table
这样的查询会挂起,直到给出错误消息,而不是返回结果;
我已经将数据克隆到一个新的MyISAM表中 - 同样的查询以及其他大型SELECT
查询将快速返回,一切正常。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.