mysql - MySQL表的性能

标签 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是标识符,设置为主键。第五行 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/

相关文章:

php - 使用 MySQLi 的动态表名称和预准备语句

mysql - 使用 group by 进行自定义查询,然后进行计数

c++ - 使用局部变量或多次访问结构值 (C++)

python - 通过python获取矢量角度

c# - Mathf.Floor 与 (int) 在性能上的对比

java - 查询延迟客户端和服务器

java - SQLException 您的 SQL 语法有错误

Mysql在子查询中返回匹配的用户

php - 这个短语 "Try to make you architecture more horizontal rather than vertical"是什么意思?

c++ - visual c++ - 为什么读取带有 unsigned char ifstream 的文件比使用 char ifstream 慢得多