【问题标题】:Performance of MySQL tableMySQL表的性能
【发布时间】:2012-03-29 08:50:57
【问题描述】:

我有一个这样创建的表:

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 像素 8Bit 灰度值图片(大小 = 625 kBytes)。

如果我要加载图片,我使用以下命令:

SELECT Picture FROM rhunkn1_omf.picture WHERE MeasNr = 2 AND 
ExperimentNr = 3 AND SequenceNr = 150;

在 MySQL 工作台中,如果我运行此命令,我会看到持续时间和获取时间!对于较小的表(800 MB,2376 个条目,图片 640x480),它非常快(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,它甚至更慢。

【问题讨论】:

    标签: mysql performance


    【解决方案1】:

    如果您可以为查询发布 EXPLAIN 会有所帮助 - 大多数情况下,答案都在其中(某处)。

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

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

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

    【讨论】:

    • 没错,但如果是我,我会更进一步,将 blob 移动到具有自动增量 PK 的单独表中,并更广泛地索引基表。
    • 这完全解决了我的问题。我刚刚删除了时间行中的主键,现在加载数据不到 100 毫秒 -> 非常感谢!将 blob 放入单独的表有什么好处?
    猜你喜欢
    • 1970-01-01
    • 2011-09-12
    • 2013-07-23
    • 2016-12-10
    • 2017-04-30
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 2019-03-16
    相关资源
    最近更新 更多