【问题标题】:Should I normalize 20 millions row x 2 column MySQL table我应该标准化 2000 万行 x 2 列 MySQL 表吗
【发布时间】:2017-05-12 05:18:39
【问题描述】:

我有一个 MySQL 表,其中包含 2000 万行和 2 列,结构如下所示。

item_id (unsigned int[11] PK) | item_name (varchar[50]) | image_path (varchar[50])

我是否应该将image_path 列分隔到另一个表中,例如

image_id | image_path

什么是性能增益/损失? join 请求是否会比 select * 请求在这个大型数据集上仅针对一个表更快?

我的数据库目前只有一张表。如果我正常化,它将是两个。

我的请求会是这样的

SELECT items.item_name, images.image_path 
FROM items 
LEFT JOIN images on images.image_id = items.image_id
WHERE item_id = 123

我目前正在使用

SELECT item_name, image_path FROM items WHERE item_id = 123

对我来说另一个困难的选择是 MySQL 分区我的表使用 RANGE 分区

什么是性能的最佳方式?

【问题讨论】:

  • 恕我直言,除非您向我们展示数据库设计中的其他表,否则您的问题没有任何意义。请edit 向我们展示您将在潜在的JOIN 操作中使用的表。
  • 每件商品可以有多张图片吗?如果没有,那么创建另一个表就没有意义了。如果是,那么您应该创建一个单独的图像表。此外,如果您对许多项目使用相同的图像,那么您应该再次考虑使用单独的表格。
  • @Shadow 我每件商品不超过一张图片。你能为你的答案提供一些资源吗?
  • 通过 BCNF 标准化是基于函数依赖的。您认为表“项目”具有哪些功能依赖关系?
  • 引入代理键作为一组值的紧凑表示与数据库规范化无关。

标签: mysql normalization database-normalization


【解决方案1】:

在您显示的查询中,您通过主键值 123 在 items 中查找一行,然后通过主键值连接到 images 中的一行。这是两个主键值查找,而您本可以完成一个。

在 MySQL 的默认存储引擎 InnoDB 中,NULL 值不占用任何存储空间。因此,我建议如果您的某些项目行具有 image_path 而有些则没有,那么只需将 image_path 定义为可为空的。这对性能来说肯定会更好。

您还询问了PARTITION BY RANGE。相对而言,2000 万行并不是一张大表。

在我管理的数据库中,我按日期对一张表进行了分区,因为它有 47 十亿 行(即表大小的 235 倍)。还有相当多的其他表有数百万行,但它们没有被分区就可以了。

只要在查找时使用索引或主键就可以了。

【讨论】:

    猜你喜欢
    • 2010-10-30
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 2021-05-28
    • 2011-11-14
    • 2019-07-31
    • 2016-11-12
    相关资源
    最近更新 更多