gpt4 book ai didi

mysql - MySQL表的性能

转载 作者:行者123 更新时间:2023-11-29 07:01:36 25 4
gpt4 key购买 nike

我有一个这样创建的表:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com