我有一个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
性能的最佳方式是什么?
答案 0 :(得分:2)
在您显示的查询中,您通过主键值123在items
中查找一行,然后按主键值加入images
中的一行。这是两个主键值查找,当你可以完成一个。
在MySQL的默认存储引擎InnoDB中,NULL
值不占用任何存储空间。所以我建议如果你的一些项目行有一个image_path而有些则没有,那么只需将image_path定义为可空。这对性能来说肯定会更好。
您还询问PARTITION BY RANGE
。相比之下,2000万行并不是一张大桌子。
在我管理的数据库中,我按日期对一个表进行了分区,因为它有4.7 十亿行(即表的大小的235倍)。还有很多其他表有数百万行,但它们很好,没有被分区。
只要在进行查找时使用索引或主键,就应该没问题。