我有一个像这样创建的表:
CREATE TABLE rh857_omf.picture(MeasNr TINYINT UNSIGNED, ExperimentNr TINYINT UNSIGNED,
Time INT, SequenceNr SMALLINT UNSIGNED, Picture MEDIUMBLOB, PRIMARY KEY(MeasNr,
ExperimentNr, Time, SequenceNr));
前四行MeasNR,ExperimentNr,Time和SequenceNr是标识符,并设置为主键。第五行,图片,是有效载荷。它是800x800 Pixel 8Bit灰度值图片(尺寸= 625 kBytes)。
如果我想加载图片,请使用以下命令:
SELECT Picture FROM rhunkn1_omf.picture WHERE MeasNr = 2 AND
ExperimentNr = 3 AND SequenceNr = 150;
在MySQL工作台中,如果运行此命令,我会看到持续时间和获取时间!对于较小的表(800 MBytes,2376个条目,图片640x480),它非常快(<100ms)。如果我拿一张更大的桌子(5800 MBytesm,9024个条目),它会变得很慢(> 9s)。
例如,我运行以下命令(在大表上):
SELECT Picture FROM rhunkn1_omf.picture WHERE MeasNr = 2 AND
ExperimentNr = 3 AND SequenceNr = 1025 LIMIT 0, 1000;
第一次需要5.2 / 3.9秒(持续时间/获取)。第二次相同的命令需要0.2 / 0.2秒。如果我更改了SequenceNr
SELECT Picture FROM rhunkn1_omf.picture WHERE MeasNr = 2 AND
ExperimentNr = 3 AND SequenceNr = 977 LIMIT 0, 1000;
它也非常快0.1 / 0.3秒
但是如果我改变了ExperimentNr,例如
SELECT Picture FROM rhunkn1_omf.picture WHERE MeasNr = 2
AND ExperimentNr = 4 AND SequenceNr = 1025 LIMIT 0, 1000;
需要很长时间4.4 / 5.9秒。
有人知道为什么数据库的行为如此以及如何提高速度?如果我创建几个较小的图片表并拆分每个表的负载会有帮助吗?顺便说一句,我使用MySQL 5.1.62和MyISAM表,但我也测试了InnoDB甚至更慢。
答案 0 :(得分:2)
如果您可以为查询发布EXPLAIN,那将会很有帮助 - 主要是答案在那里(某处)。
然而,在猜测中,我会通过您的主键包含TIME,而您的查询不包含来解释此行为;因此,他们可能只会部分使用指数。我猜测查询计划使用索引来过滤掉MEASNR和ExperimentNr范围内的记录,然后扫描匹配的sequenceNrs。如果有许多记录符合前两个标准,那可能会很慢。
您第二次看到加速的原因是查询被缓存;这是不可预测的,具体取决于负载,缓存大小等。
尝试创建一个与“where”子句匹配的索引,并参阅EXPLAIN告诉你的内容。