我有一个这样创建的表:
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是标识符,设置为主键。第五行 Picture 是有效负载。它是一张 800x800 像素的 8 位灰度值图片(大小 = 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,它甚至更慢。
最佳答案
如果您能发布 EXPLAIN 会有所帮助对于查询 - 大多数情况下,答案都在那里(某处)。
但是,我猜测,我会通过您的主键包含 TIME 而您的查询不包含这一事实来解释这种行为;因此,他们可能只部分使用索引。我猜测查询计划使用索引过滤掉 MEASNR 和 ExperimentNr 范围内的记录,然后扫描匹配的 sequenceNrs。如果有很多记录符合前两个条件,那可能会很慢。
您看到第二次加速的原因是查询被缓存;这不是非常可预测的,具体取决于负载、缓存大小等。
尝试创建一个与您的“where”子句匹配的索引,并查看 EXPLAIN 告诉您的信息。
关于mysql - MySQL表的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9922019/