【问题标题】:Slow SQL Queries after listing larger table列出更大的表后慢速 SQL 查询
【发布时间】:2017-07-18 09:04:03
【问题描述】:

让我们调用有问题的数据库db,我们还调用具有几百行的较小表x,以及具有超过10k 行的较大表y


当我向表 x 发出查询时,使用基本查询 SELECT * FROM x LIMIT 25 在大约 0.0003 秒内发出查询没有任何问题。

这适用于db 中所有较小的表,所有查询的处理时间约为 0.3 毫秒。

但是,在向表 y 发出相同的基本查询 SELECT * FROM y LIMIT 25 后,该过程明显变慢。有时需要 100ms 来处理。


它影响表y的查询时间x的查询时间。


在重新发布表x 列表几次或在db 中列出另一个小表后,问题似乎消失了。来自另一个数据库的表仍然很慢。

我已经阅读了很多关于可以提高查询速度的优化和性能增强的文章。然而,他们似乎都没有涵盖这个问题。

【问题讨论】:

  • Bot表字段是否相同?他们有FK吗?您能否给我们描述一下它们,也许我们可以以更好的方式帮助您。
  • 我认为你应该考虑缓存
  • @VíctorLópez 表格的结构似乎并不重要。我在另一个数据库中有另一个大表,列数较少,但问题仍然存在。而且他们不受 FK 限制
  • @RiggsFolly 我有两个表的 PK 索引
  • 我希望你没有多余的INDEX(pk)。请记住,PRIMARY KEY(pk) 既是 UNIQUE 又是 INDEX

标签: mysql sql database performance innodb


【解决方案1】:

优化和性能以及表大小不是问题;缓存是。

  • 由于没有WHEREGROUP BYORDER BY,因此索引无关紧要。

  • LIMIT 25,没有ORDER BY,将抓取前25行;后面有多少行并不重要。

  • 如果“查询缓存”处于开启状态,那么第一次运行查询时,它会变慢。之后(直到从缓存中溢出),它会“很快”——0.3ms 是非常典型的。

  • 即使 QC 关闭,也有其他缓存可以解释差异。

【讨论】:

  • 是的,每次我运行查询时都会出现缓慢,而且它似乎也会影响在它之后运行的所有查询,无论是哪一个
  • innodb_buffer_pool_size 是重要的缓存可调参数。它的价值是什么?你有多少内存?
  • innodb_buffer_pool_size 设置为默认的 16M。我改变了它的值,果然,事情似乎运行得更快了。谢谢!
  • 好。如果您至少有 8GB,则 70% 的 RAM 是一个很好的设置。如果 16M 是默认值,则您必须拥有 MySQL 的“旧”副本。
猜你喜欢
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-08
  • 2015-07-23
相关资源
最近更新 更多