MySQL SELECT非常慢,因为LONGBLOB

use*_*332 6 mysql performance

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

table xxx
-> id primary key
-> name varchar 255
-> data longblob
Run Code Online (Sandbox Code Playgroud)

当我存储到这个表100个文件时,每个100MB,该表将有10GB

然后尝试选择任何行...它需要很长时间

SELECT name FROM xxx WHERE id = 50 LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

大约需要8秒钟

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

Ilm*_*nen 7

尝试将blob拆分为单独的表.

例如,你可以有一个表xxx包含列idname,另一个表xxx_data包含列iddata.如果您只想要名称,则根本不需要查询xxx_data表格; 如果您同时需要名称和数据,则可以使用共享主键将表连接在一起id:

SELECT id, name, data
FROM xxx JOIN xxx_data USING (id)
WHERE id = ...
Run Code Online (Sandbox Code Playgroud)

有关更多信息和优化想法,请参阅例如优化MySQL查询的10个技巧.

  • 我只想补充一点,你应该考虑将这些文件存储在文件系统而不是数据库中.当然有理由将它们存储在数据库中(如安全性,易于删除,易于在许多服务器上复制等)但是想象一下你想要返回10个文件...你查询数据库然后存储10*100MB RAM.你真的想在服务器上消耗1GB的内存只是为了返回文件,而你可以从服务器上的某个位置流式传输它们吗?我认为你的文件有点太大而无法存储在数据库中. (2认同)