Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL SELECT非常慢,因为LONGBLOB_Mysql_Performance - Fatal编程技术网

MySQL SELECT非常慢,因为LONGBLOB

MySQL SELECT非常慢,因为LONGBLOB,mysql,performance,Mysql,Performance,为什么或者如何解决mysql上的问题 table xxx -> id primary key -> name varchar 255 -> data longblob 当我在这个表中存储100个文件时,每个100MB,这个表将有10GB 然后尝试选择任意一行。。。要花很长时间 SELECT name FROM xxx WHERE id = 50 LIMIT 1; 大约需要8秒 我的问题可能在于,mysql在返回name(只有255个字符)之前读取整行内容。。。因此,当我想列

为什么或者如何解决mysql上的问题

table xxx
-> id primary key
-> name varchar 255
-> data longblob
当我在这个表中存储100个文件时,每个100MB,这个表将有10GB

然后尝试选择任意一行。。。要花很长时间

SELECT name FROM xxx WHERE id = 50 LIMIT 1;
大约需要8秒


我的问题可能在于,mysql在返回
name
(只有255个字符)之前读取整行内容。。。因此,当我想列出100个文件的名称时,mysql读取10GB并返回大约2KB的结果。

尝试将blob拆分为一个单独的表

例如,您可以有一个包含列
id
name
的表
xxx
,以及另一个包含列
id
数据的表
xxx\u data
。如果只需要名称,则根本不需要查询
xxx\u数据
表;如果同时需要名称和数据,可以使用共享主键
id

选择id、名称、数据
使用(id)从xxx加入xxx_数据
其中id=。。。

有关更多信息和优化想法,请参见,例如。

StackExchange在您编写问题/答案时显示问题/答案的预览。请查看预览并确保格式正确。如果您编写的预格式化代码在预览中显示为一行,那么其他人也会这么看。因此,使用“代码示例”按钮来正确地格式化(或者在每个行之前放置4个空间,SE将知道它的预格式化代码)。我只需在上面添加一个,您应该考虑将这些文件存储在文件系统中而不是数据库中。当然,将它们存储在数据库中是有原因的(比如安全性、易于删除、易于跨多台服务器复制等),但是假设您想要返回10个文件……您查询数据库,然后在RAM中存储10*100MB。您真的想在服务器上消耗1GB的RAM来返回文件,而您可以从服务器上的某个位置流式传输文件吗?我认为您的文件太大,无法存储在数据库中。如果您不一定需要数据库中的数据,也可以将其移动到文件系统中。我认为这在处理大量文件或大文件时效果更好。