针对这些项目需求,选择 MyISAM 而不是 InnoDB;和长期选择

6 mysql innodb myisam database-design

很抱歉这篇很长的帖子,但我必须提供尽可能多的信息,以使这个非常模糊的问题更加具体。

我的项目的目标是让用户搜索各种产品的(巨大)数据库。

  • 每个产品都存在于一个类别下。
  • 每个产品将有 10 到 100 个“规格”或“功能”,用户将通过这些“规格”或“功能”进行搜索。

最常见的用例是:

  1. 用户点击一个类别;然后根据需要单击各种子类别。
  2. 用户从 1 或 2 个条件开始并搜索产品。
  3. 然后,用户不断向搜索添加更多条件以缩小产品范围。

我有三个主要表“产品”、“功能枚举”和“功能”。让数据输入用户为产品即时创建新的“功能”非常重要 - 因此我使用 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 个测试行。这是平均值。主要搜索查询的运行时间:

  1. 没有索引的 InnoDB:90 年代。
  2. 带索引的 InnoDB:15 秒。 缓冲池大小增加后 0.3 秒
  3. 没有索引的 MyISAM:9 秒。
  4. 带索引的 MyISAM:0.7 秒。
  5. 带有索引 + 固定行类型的 MyISAM:0.16s。

测试机 - 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. 如果 InnoDB 运行时间错误/令人惊讶,我在测试中错过了什么?增加缓冲池大小会显着提高性能。看上面。
  2. 如果不是,考虑到以上所有因素,从长远来看,MyISAM 真的是不错的选择吗?
  3. 如果后来证明 MyISAM 也是一个糟糕的选择,我如何轻松地重组数据库?我有哪些选择?

旁注:

  1. 如果选择 EAV 不好,我可以在这个项目中使用什么其他架构?

小智 1

根据我使用 MySQL 的经验,MyIsam 在插入和读取方面确实非常快。另一方面,如果有许多用户同时访问数据库插入和查询数据,您将开始看到 MyIsam 的性能急剧下降。

MyIsam 适合以下情况:

  • 你有很多写入而很少读取
  • 你有很多读取而很少写入
  • 你有一个博客。大多数时候,每天在帖子和评论之间只有少数人写文章

MyIsam 在以下情况下很糟糕:

  • 您同时发生大量读取和写入操作

我测试了 PostGreSQL,当数据库受到同时读写的严重打击时,它的性能优于 MySQL MyIsam。此外,当您的网站流量较高时,MyIsam 往往每月至少会被损坏一次。