2012-03-29 68 views
1

的我有这样创建的表:性能MySQL表

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,时间和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。

回答

2

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

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

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

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

+0

的确如此,但如果是我,我会更进一步,将blob移动到带有自动增量PK的单独表格中,并更广泛地索引基表。 – symcbean 2012-03-29 09:21:43

+0

这确实解决了我的问题。我只是删除了时间行中的主键,现在,加载数据所用的时间不到100毫秒 - >非常感谢!将blob放入单独的表格有什么好处? – 2012-03-29 09:33:47