6 mysql innodb myisam database-design
很抱歉这篇很长的帖子,但我必须提供尽可能多的信息,以使这个非常模糊的问题更加具体。
我的项目的目标是让用户搜索各种产品的(巨大)数据库。
最常见的用例是:
我有三个主要表“产品”、“功能枚举”和“功能”。让数据输入用户为产品即时创建新的“功能”非常重要 - 因此我使用 EAV(反)模式。
以下是表的结构:
'products'
ID(PK), TITLE, CATEGORY
(Indexed by CATEGORY)
'features_enum'
ID(PK), TITLE
'features'
P_ID, F_ID, VAL
(Indexed by P_ID and then F_ID)
Run Code Online (Sandbox Code Playgroud)
我的主要搜索查询的示例格式:
SELECT
p.ID,
p.TITLE PROD_TITLE,
fe.TITLE FEATURE_TITLE,
f.VAL
FROM
products p, features f, features_enum fe
WHERE
p.CATEGORY = 57 AND
p.ID = f.P_ID AND
f.F_ID = fe.ID AND
(
(f.F_ID = 1 AND f.VAL = 'Val1') AND
(f.F_ID = 2 AND f.VAL = 'Val2') AND
...
(f.F_ID = N AND f.VAL = 'ValN') AND
)
Run Code Online (Sandbox Code Playgroud)
我的实验到目前为止:
由于我在 DB 方面的知识和经验有限,我在理论规划方面遇到了困难。所以,我生成了大量的测试数据来简单地看看什么是有效的。所有三个表都有 500,000 个测试行。这是平均值。主要搜索查询的运行时间:
测试机 - Pentium 4 1.9GHz, 1.5GB RAM, IDE HDD, Win7.
除了索引之外,我基本上没有做任何优化。所以我可能遗漏了很多东西,它们本来可以使 InnoDB 运行得更快。InnoDB 缓冲池大小设置为 16M (!!);我将它增加到 128M。现在,InnoDB 真的很快。所以我倾向于 MyISAM 的一个重要原因现在已经不复存在了。也许我能做的还有更多。
关于该项目的一些要点和长期使用估计:
每天添加 20 种新产品,大约每天 20 x 100“规格”= 2000 条记录写入。
1,000,000 次页面访问,在最坏的情况下 - 每天运行相同数量的搜索查询。
每个表的总记录数预计将达到 5,000,000。
写作将由一群半控制的人进行,而阅读是公开的。
没有复杂的“事务”类型写入。我现在能想到的最复杂的写法是 - [一个产品行 + 最多 100 个特征行] - 一次性
只需要几个约束,但如果需要选择 MyISAM,我可以在应用程序级别本身强制执行它们。
从应用程序的其他部分(用户注册、身份验证等)访问数据库的情况很少,而且很远,我认为它们不会产生太大影响。
鉴于所有这些,我偏向于 MyISAM。但我需要已经有 MySQL 经验的人的意见。
问题:
旁注:
小智 1
根据我使用 MySQL 的经验,MyIsam 在插入和读取方面确实非常快。另一方面,如果有许多用户同时访问数据库插入和查询数据,您将开始看到 MyIsam 的性能急剧下降。
MyIsam 适合以下情况:
MyIsam 在以下情况下很糟糕:
我测试了 PostGreSQL,当数据库受到同时读写的严重打击时,它的性能优于 MySQL MyIsam。此外,当您的网站流量较高时,MyIsam 往往每月至少会被损坏一次。
| 归档时间: |
|
| 查看次数: |
1681 次 |
| 最近记录: |