Mysql 如何在数据库中有效地存储图片?

Mysql 如何在数据库中有效地存储图片?,mysql,Mysql,我计划将图片存储在数据库(MySQL 5.6.15,InnoDB)中作为MEDIUMBLOB,我想知道哪种表结构更有效 对于每一张图片,我都会存储一个校验和,每次先检查校验和,看看图片是否需要更新。考虑到每次都会访问校验和,但图片可能不会,如果我将它们存储在一个表或两个单独的表中,是否会产生差异(性能方面): |用户id |图片|图片|校验和| 或 |用户id |图片| |用户|标识|图片|校验和| (注:我不想进入“文件系统与数据库”的争论,我将使用数据库。)一个表是解决问题的方法,因为数据本

我计划将图片存储在数据库(MySQL 5.6.15,InnoDB)中作为MEDIUMBLOB,我想知道哪种表结构更有效

对于每一张图片,我都会存储一个校验和,每次先检查校验和,看看图片是否需要更新。考虑到每次都会访问校验和,但图片可能不会,如果我将它们存储在一个表或两个单独的表中,是否会产生差异(性能方面):

|用户id |图片|图片|校验和|

|用户id |图片|

|用户|标识|图片|校验和|


(注:我不想进入“文件系统与数据库”的争论,我将使用数据库。)

一个表是解决问题的方法,因为数据本质上是相关的,并且没有X对多的关系

在执行简单查询时,请注意不要加载图像<代码>选择*是一个坏主意,因为如果您从未使用过该数据,它会导致连接上出现兆字节的数据

相反,应尽可能精确:

SELECT picture_checksum FROM pictures WHERE user_id=?

请注意,您可能希望使用比简单校验和更健壮、更抗冲突的工具,如SHA1。

如果每张图片都有校验和,那么我认为将它们存储在同一个表中是有意义的。只要在select语句中指定列,我看不出有任何理由会影响性能。我看不出有任何理由使用两个表。我同意一个表就可以了,只是不要用select语句选择所有内容。虽然将来您可能会后悔,因为您的表太大,无法有效地复制或备份,但为什么要使用
MEDIUMBLOB
而不是最大的类型?两者几乎相同,但限制更高,
LONGBLOB
可以容纳几乎任何东西,甚至是高分辨率图像。我的主要问题是,我对MySQL如何存储表不太了解:即使我做了一个不返回图片的正确选择,DB服务器本身也必须“读取”图像数据,因为它们在一个表中——或者我认为是这样。MySQL可以跳过它不需要读取的数据,这没什么大不了的。但是,如果您要求提供数据,它将被迫读取数据并将其发送给您的客户,这就是为什么在处理包含
BLOB
TEXT
列的表时,您需要具体说明所需列的原因。通过加载一万个图像作为测试,尝试自己对其进行基准测试。