【问题标题】:Which of these MySQL database designs (attached) is best for mostly read high performance?这些 MySQL 数据库设计(附加)中的哪一个最适合大多数读取高性能?
【发布时间】:2011-09-15 12:01:47
【问题描述】:

我是 MySQL 的数据库管理员和开发人员。我已经使用 MySQL 工作了几年。我最近学习并学习了 O'Reilly 高性能 MySQL 第 2 版,以提高我在 MySQL 高级特性、高性能和可扩展性方面的技能,因为我经常因缺乏对 MySQL 的高级知识而感到沮丧(在很大程度上,我还有)。

目前,我正在做一个模棱两可的网络项目。在这个项目中,我们将从一开始就有相当的内容和用户。我是数据库的设计者,这个数据库必须非常快(一些插入,但大多数更重要的是读取)。

我想在这里讨论这些要求

  • 会有几种物品
  • 项目在common中有一些字段和关系
  • 这些项目也有一些字段和关系特殊使它们彼此不同
  • 必须将这些项目全部列出一起按公共字段或关系排序或过滤
  • 项目也必须仅按类型列出(例如 item_specialA)

我有一些基本的设计疑问,希望您能帮助我决定并了解哪种设计方法更适合高性能 MySQL 数据库。

经典方法

下图显示了在数据库中使用头脑思维可能首先想到的经典方法:Database diagram

集中式方法

但也许我们可以通过一些或伪面向对象的范式来改进它,将公共项目和关系集中在一个公共项目表上。它对于列出所有类型的项目也很有用:Database diagram


  • 各有优缺点?
  • 看到之前的要求,您会选择哪种方法或应用哪些更改?

提前谢谢大家!!

【问题讨论】:

    标签: mysql database performance database-design


    【解决方案1】:

    您拥有两种不同的数据映射策略。在其他来源中,您所说的“经典”是“每个具体类一个表”,而您所说的“集中式”是“每个类一个表”(Mapping Objects to Relational Databases: O/R Mapping In Detail)。它们都有各自的优点和缺点(按照上面的链接)。第一个策略中的查询会更快(您只需要连接 2 个表,而在第二个策略中需要 3 个)。

    【讨论】:

    • 感谢您的链接。很有用!!
    【解决方案2】:

    我认为你应该探索经典的超类型/子类型模式。以下是来自 SO 的 some examples

    【讨论】:

    • 它对我有所帮助,但我想在我上面发布的示例中获得更多更简洁的内容。
    • @Emilio,很难阅读您的模型,所有内容都称为 item 或 item_special。是你不知道什么是(可能是)还是……?
    • 这是一个例子。 Item_specialA、B 或 C 是​​ item 的子项。我已经知道它们是什么,但是阅读模型会变得更加复杂。您也可以阅读图中的注释进行说明。
    【解决方案3】:

    如果您主要追求速度,请考虑选择性地使用 MyISAM 表,使用集中的“对象”表,并在此表单上仅添加一个具有正确索引的表:

    object_type | object_id | property_name | property_value
    user        | 1         | photos        | true
    city        | 2         | photos        | true
    user        | 5         | single        | true
    city        | 2         | metro         | true
    city        | 3         | population    | 135000
    

    等等...例如,对主键或索引键(object_type、object_id、property_name)的查找将非常快。此外,随着新属性的出现,您减少了以 457 个表结尾的需要。

    它并不是一个精心设计或完美规范化的数据库,如果您正在寻找一个长期的大型网站,您应该考虑缓存,或者至少使用非规范化范例,像这样的非规范化 mysql 表,redis,或者可能是 MongoDB。

    【讨论】:

    • 为什么选择 MyISAM 而不是 InnoDB? InnoDB 扩展性更好,主键查找速度更快。
    • "selective use" ,用户指出作为一项要求(一些插入,但主要和更重要的是阅读),几乎互联网上的任何提示都会引导我们选择性地使用 MyISAM 以获得高读/写率。对于读取,MyISAM 在历史上更快。对于写入,InnoDB 是事务性的,MyISAM 不担心原子写入,因此也会更快。
    • 抱歉,在非商品硬件上正确配置的 MySQL 实例将使用 InnoDB 产生更好的结果。 InnoDB 有不同的基于主键存储数据的方法,因此主键查找更快。尝试谷歌 HandlerSocket 并检查原因。另一方面 - 是的,MyISAM 在写入方面更快,但在读取方面则不然(不是说少量数据,它在少量数据时表现更好)。
    • 另外,如果你可以用磁盘换取速度,你可以尝试一个简单的“ALTER TABLE tblname ROW_FORMAT=FIXED;”在您的表格中,在某些情况下,它应该会给您带来大约 15-20% 的额外性能提升。看看 DYNAMIC(默认)与 FIXED 尺寸表。
    • 当我们进入“大数据”的世界时,你是对的,我已经尝试过 Percona 补丁等等......但我认为原始帖子的案例场景(因为我知道这个项目) 可能永远不会超过 10 万个独特的对象,因为它是一个“学生旅行”网络,我真的认为这是他们可以拥有的“顶级”记录,所以事实上,对我来说,这是相当少量的数据和我可以考虑任何 InnoDB 或 MyISAM,只是将 MyISAM 指向“整体”速度。恕我直言,一个好的设计,即使没有非规范化,也应该足以满足这个用例。
    猜你喜欢
    • 1970-01-01
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 2011-09-17
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    相关资源
    最近更新 更多