Mysql BLOB性能

时间:2015-03-23 06:35:23

标签: mysql

我有一个简单的Mysql 5.1(也是试用过的5.6版)BLOB表,带有字符串主键' filename'和BLOB字段。

CREATE TABLE records (filename VARCHAR(255) PRIMARY KEY, file_content LONGBLOB)

此表包含大约1520条记录,其file_content大小介于30KB到1MB之间。以下是一些令人惊讶的查询时间:

SELECT filename FROM records -- (31 milli-secs, 1520 rows)
SELECT filename FROM records WHERE filename like '%1-11-1.param' -- (31 milli-secs, 304 rows)
SELECT * FROM records  -- (8.5 seconds, 1520 rows)
SELECT * FROM records WHERE filename = 'file-1-11-1.param' -- (32 milli-secs, 1 row)
SELECT * FROM records WHERE filename like '%1-11-1.param' -- (3.5 seconds, 304 rows)

当选择file_content时,查询很慢,除非WHERE子句具有直接标识。但是,如果我做一个自我JOIN(模仿最后一个SELECT)

SELECT a1.filename, a1.file_content FROM records AS a1
INNER JOIN
(SELECT filename FROM records WHERE filename LIKE '%1-11-1.param') AS a2
ON a1.filename = a2.filename
-- (359 milli-secs, 304 rows)

当JOIN产生相同结果时,为什么JOIN比简单选择*快得多(359毫秒<3.5秒)?

修改 我已经尝试过与SQLServer 2008R2相同的功能。我可以报告这个数据库没有减速。所有测试都很快,但是必须检索所有数据(如MySQL)需要9秒,因为它返回大约500MB的数据。

我也尝试使用MySQL Engine = InnoDB,ROW_FORMAT = DYNAMIC。没有帮助。我希望这意味着每次LIKE测试都不会将BLOB加载到内存中。

2 个答案:

答案 0 :(得分:0)

可疑的是,查询花费的所有时间都只是mysql客户端和服务器之间的I / O.

304行可能会导致304MB结果集,这很多。

如果您不需要整个BLOB,我宁愿单独查询文件名字段

答案 1 :(得分:0)

经过更多的研究和测试后,似乎对于MySQL:

如果必须测试行中的字段(例如LIKE),则它会检索SELECT或WHERE中出现的每个字段,即使测试失败或可能快速失败。对于大型BLOB字段,这是一个真正的问题,尤其是不适合行内存的BLOB(大于65K)。

如果可以从字段上的INDEX确定测试,则只检索匹配的行。