我应该规范化20万行x 2列MySQL表

时间:2016-12-27 23:08:17

标签: mysql normalization database-normalization

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

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

我应该将image_path列与另一个表分开,例如

image_id | image_path

性能增益/损失是什么? 加入请求的速度要比选择* 请求的速度快吗?

我的数据库现在只有一个表。如果我正常化它将是两个。

我的要求就像

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 Partitioning 我的表格 RANGE Partitioning

性能的最佳方式是什么?

1 个答案:

答案 0 :(得分:2)

在您显示的查询中,您通过主键值123在items中查找一行,然后按主键值加入images中的一行。这是两个主键值查找,当你可以完成一个。

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

您还询问PARTITION BY RANGE。相比之下,2000万行并不是一张大桌子。

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

只要在进行查找时使用索引或主键,就应该没问题。