MySQL表的性能

时间:2012-03-29 08:50:57

标签: mysql performance

我有一个像这样创建的表:

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甚至更慢。

1 个答案:

答案 0 :(得分:2)

如果您可以为查询发布EXPLAIN,那将会很有帮助 - 主要是答案在那里(某处)。

然而,在猜测中,我会通过您的主键包含TIME,而您的查询不包含来解释此行为;因此,他们可能只会部分使用指数。我猜测查询计划使用索引来过滤掉MEASNR和ExperimentNr范围内的记录,然后扫描匹配的sequenceNrs。如果有许多记录符合前两个标准,那可能会很慢。

您第二次看到加速的原因是查询被缓存;这是不可预测的,具体取决于负载,缓存大小等。

尝试创建一个与“where”子句匹配的索引,并参阅EXPLAIN告诉你的内容。