mysql – 为什么count(*)查询在某些表上变慢而在其他表上没有?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了mysql – 为什么count(*)查询在某些表上变慢而在其他表上没有?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1808字,纯文字阅读大概需要3分钟。
内容图文
我已经在wamp服务器上运行了一个mysql数据库,我正在使用它来对Flickr数据进行频繁的模式挖掘.在将数据加载到数据库的过程中,我运行了一个计数查询来确定我已经加载了多少图像.我很惊讶它耗时3分49秒
select count(*) from image;
在一个单独的表“概念”中,我存储了用户提供图像的标签列表. “概念”表上的类似查询耗时0.8秒.神秘之处在于两个表都有大约200,000行.从图像中选择计数(*);返回283,890并从概念中选择count(*);返回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,因此这两个表都应该很容易适应.我错过了什么会减慢我的查询速度?我该如何解决?
解决方法:
在InnDB表上执行SELECT COUNT(*)时,MySQL必须扫描索引来计算行数.在这种情况下,您唯一的索引是主(聚簇)索引,因此MySQL会对其进行扫描.
对于聚簇索引,实际的表数据也存储在那里.不包括开销,你的图像表大约是每行1973字节(我假设两个主键列都有一个单字节字符集).这是每(16k)页最多8条记录,所以大约35,486页.您的comcept表每行大约257个字节.那是每页大约63条记录,所以大约有3,386页.这是必须扫描的数据量的巨大差异.
它必须完全读取每个页面,因为页面可能不完整.
然后,性能方面,也许这些页面中的一些在内存中,而另一些则不在内存中.由于MySQL的15/16偏好,也存在一些边际差异,但上述所有数字都应视为近似值.
解
将二级索引添加到较大的表应该产生与较小的表大致相同的SELECT COUNT(*)性能.当然,要更新另一个索引,更新会慢一点.
为了提高性能,请缩短主键,因为二级索引包括索引列和完整主键.
如果您只需要估计的行数,则可以使用以下某个行中的行值,该值使用表统计信息而不是扫描索引:
SHOW TABLE STATUS LIKE 'image'
要么
EXPLAIN SELECT COUNT(*) FROM image
内容总结
以上是互联网集市为您收集整理的mysql – 为什么count(*)查询在某些表上变慢而在其他表上没有?全部内容,希望文章能够帮你解决mysql – 为什么count(*)查询在某些表上变慢而在其他表上没有?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。