【发布时间】:2015-05-05 21:45:21
【问题描述】:
我有一个运行在 wamp 服务器上的 mysql 数据库,我用它来对 Flickr 数据进行频繁的模式挖掘。在将数据加载到数据库中的过程中,我运行了一个计数查询来确定我已经加载了多少张图像。我很惊讶它花了 3 分 49 秒
select count(*) from image;
在一个单独的表“概念”中,我存储了用户为其图像提供的标签列表。对“概念”表的类似查询耗时 0.8 秒。奥秘在于这两个表都有大约 200,000 行。 select count(*) from image; 返回 283,890,select count(*) from concept; 返回 213,357。
这是每个表的描述
显然,“图像”表的行数更大。我认为基于this blog post 可能“图像”太大而无法保存在内存中,因此我还使用this answer 中的代码测试了表的大小。
SELECT table_name AS "Tables",
round(((data_length + index_length) / 1024 / 1024), 2) "Size in MB"
FROM information_schema.TABLES
WHERE table_schema = "$DB_NAME"
ORDER BY (data_length + index_length) DESC;
“图片”为 179.98 MB,“概念”为 15.45 MB
我在具有 64 GB RAM 的机器上运行 mysql,因此这两个表应该很容易适应。我错过了什么会减慢我的查询速度?我该如何解决?
【问题讨论】:
-
两张表使用的是什么存储引擎?是
imageinnoDB 吗? -
如果你改为使用 count(id) 会改变执行所需的时间吗?
-
@Interrobang 是的,两者都是 innoDB。这是“图像”的错误选择吗?
-
@Aziz 我尝试使用 count(id),“图像”花了 3 分 13 秒,所以只好 30 秒。
-
@2cents 有趣!然后我什么都没得到:)