mySQL的速度和调整(10亿行)

时间:2017-07-18 16:09:47

标签: mysql sql optimization database-administration database-tuning

我的公司有一个分析师团队使用的mySQL服务器(通常一次3-4个)。最近,对于一个表格数量达10亿行(10 ^ 9条记录)的数据库,查询已经放慢了速度,有些甚至需要几天时间。

  • 服务器主要功能: Linux OS-64 GB内存 - 3 TB硬盘。

我们对微调一无所知,所以任何工具/经验法则都可以找出导致问题的原因或者至少缩小范围,这是值得欢迎的。

前往Workbench工作室>表格检查员我发现了我们最常用的数据库的这些关键值:

  • 数据库大小: ~500 GB
  • 最大表格尺寸:~80 Gbytes
  • 索引长度(对于最大的表):~230 GB。该索引依赖于6个字段。
  • 几乎没有MyISAM表,所有InnoDB

理想情况下,我想以最简单的方式微调服务器(更好),数据库(更糟糕)或两者(未来),以加快速度。

我的问题:

  1. 这些值(500,80,230 GB)是否正常且可管理 中型服务器?
  2. 这个大小为-230Gb的索引是否正常,比表本身大?
  3. 可以调整哪些参数/策略来解决这个问题?我正在考虑记忆日志,或购买服务器内存,但很高兴调查任何明智的答案。
  4. 非常感谢。

4 个答案:

答案 0 :(得分:5)

如果您正在管理这种规模的MySQL实例,那么值得您花时间阅读High Performance MySQL,这是关于MySQL调优的最佳书籍。我强烈建议你读这本书并阅读它。

您的InnoDB缓冲池可能仍处于默认大小,而不是利用Linux系统上的RAM。如果你还没有配置MySQL来使用它,那么你有多少RAM并不重要!

还有其他重要的调整参数。 MySQL 5.7 Performance Tuning Immediately After Installation是对最重要的调优选项的精彩介绍。

索引可以大于表格本身。近4比1的因素是不寻常的,但不一定是坏的。这取决于您需要哪些索引,除非您考虑需要针对此数据运行的查询,否则无法知道这些索引。

几年前我做了一个演示文稿How to Design Indexes, Really(它与当前版本的MySQL相关)。以下是视频:https://www.youtube.com/watch?v=ELR7-RdU9XU

答案 1 :(得分:3)

以下是您要检查的顺序:

1)调整索引。选择一个常用的慢查询并进行分析。了解EXPLAIN ANALYZE,以便您可以判断您的查询是否正确使用索引。您的表完全可能没有正确编制索引,并且您的日常查询可能会在几分钟内完成。从字面上看。如果没有适当的索引,您的查询将进行全表扫描以进行连接,并且数十亿行将会非常非常慢。

对索引的一个很好的介绍是http://use-the-index-luke.com/,但有关于该主题的书籍和文章数以万计。

1a)用其他慢查询重复#1。看看你是否可以改进它们。如果您已经处理了许多慢速查询并且无法加速它们,那么请继续进行服务器调整。

2)调整你的服务器。 Bill Karwin的链接在那里很有帮助。

3)看看增加的硬件/ RAM。这应该是最后的手段。

花时间与#1。这可能是最好的回报。你可以做很多事情来改善事情而不花一分钱。您还将学习如何编写更好的查询并创建更好的索引,并在将来防止这些问题。

另外:听听Bill Karwin和他的知识。他是资本E的专家。

答案 2 :(得分:3)

在对600个相当随机的表(一些比你的表大得多)的调查中,你的230GB:80GB比率将达到大约99%。请提供SHOW CREATE TABLE,以便我们讨论您是“做错了什么”,或者只是一种极端情况。 (很少有6列索引是可取的。如果它是单个索引,加起来高达230GB,那就是“错误”。)

我看到更大的桌子在小型机器上运行良好。如果您主要进行“点查询”,则几乎没有大小限制。如果您使用的是UUID,那就搞砸了。也就是说,它实际上取决于数据,查询,架构,月相,你的业力等。

交叉加入可以很容易地完成万亿事情。与eq_ref的连接通常不比没有连接的查询慢得多。

“你无法改变你的性能问题。” “在性能问题上投掷硬件要么浪费钱,要么推迟不可避免的事情。”相反,我们会看到“正在放慢速度的查询”,以及EXPLAIN SELECT ...SHOW CREATE TABLE

这是一个数据仓库应用程序吗?你有摘要表吗?

这是我的Cookbook on creating indexes。但是如果你向我们展示你的代码可能会更快。

我可以提供另一个Tuning Analysis

EXPLAIN SELECT .....是调查您的求助请求所需信息的重要组成部分。

为每个相关的表显示CREATE TABLE也会有所帮助。

此时,用户......的数据中均未显示......

答案 3 :(得分:1)

我会尝试回答你的问题,但请记住,我不是MySQL专家。

1)这是一个相当大的数据库,有大表,但没有相当大的服务器无法处理。但这实际上取决于你的工作量。

2)索引大小大于表本身很有意思,但它可能是该表上所有索引的大小。在那种情况下,这是完全正常的。

3)服务器中64 GB的RAM意味着可能会有大量磁盘操作正在进行,这肯定会让您失望。所以添加一些内存肯定会有所帮助。也许检查使用iotop运行查询时服务器的行为方式。并将其与顶部的信息进行比较,以查看服务器是否在磁盘上等待。