mySQL(10 亿行)的速度和调整
Speed and tuning for mySQL (1billion rows)
我的公司有一个 mySQL 服务器供一个分析师团队使用(通常一次 3-4 个)。最近查询速度变慢了,其中一些查询甚至需要几天时间,因为数据库有 table 多达 10 亿行(10^9 条记录)。
- 服务器主要特点: Linux OS-64 GB 内存- 3 TB 硬盘。
我们对微调一无所知,因此欢迎任何 tool/rule 找出导致问题的原因或至少缩小问题范围的经验。
去 Workbench studio>Table inspector 我发现了我们最常使用的数据库的这些关键值:
- 数据库大小: ~500 GB
- 最大 table 大小:~80 GB
- 索引长度(最大table):~230 GB。该索引依赖6个字段。
- 几乎没有 MyISAM table,所有 InnoDB
理想情况下,我想以最简单的方式微调服务器(更好)、数据库(更差)或两者(将来),以加快速度。
我的问题:
- 这些值(500、80、230 GB)是否正常且可管理?
中型服务器?
- 索引大小为 -230Gb- 比 table 本身大很多正常吗?
- 可以调整什么 parameters/strategy 来解决这个问题?我正在考虑内存日志或购买服务器 RAM,但很乐意调查任何明智的答案。
非常感谢。
我会尽力回答您的问题,但请记住,我不是 MySQL 专家。
1) 这是一个相当大的数据库,有很大的 table,但没有什么是相当大的服务器无法处理的。但这实际上取决于您的工作量。
2) 索引大小大于 table 本身很有趣,但它可能是 table 上所有索引的大小。那样的话就完全正常了。
3) 服务器中 64 GB 的 RAM 意味着可能会进行大量磁盘操作,这肯定会减慢您的速度。因此,添加一些内存肯定会有所帮助。也许检查查询是 运行 iotop 时服务器的行为方式。并将其与顶部的信息进行比较,以查看服务器是否正在等待磁盘。
如果您正在管理这种规模的 MySQL 实例,那么值得您花时间阅读 High Performance MySQL,这是关于 MySQL 调整的最佳书籍。我强烈建议你得到这本书并阅读它。
您的 InnoDB 缓冲池可能仍处于默认大小,没有利用 Linux 系统上的 RAM。如果您没有配置 MySQL 使用它,那么您有多少 RAM 都没有关系!
还有其他重要的调整参数。 MySQL 5.7 Performance Tuning Immediately After Installation 是对最重要的调整选项的精彩介绍。
索引 可以 大于 table 本身。将近 4 比 1 的比例很不寻常,但不一定是坏事。这取决于您需要什么索引,除非您考虑需要针对此数据 运行 的查询,否则无法知道这一点。
我做了演示How to Design Indexes, Really a few years ago (it's just as relevant to current versions of MySQL). Here's the video: https://www.youtube.com/watch?v=ELR7-RdU9XU
这是您要检查的顺序:
1) 调整索引。选择一个常用的慢查询并分析它。了解 EXPLAIN ANALYZE 以便您可以判断您的查询是否正确使用了索引。完全有可能您的 table 未正确编入索引,而您几天的查询可能 运行 在几分钟内。字面上地。如果没有适当的索引,您的查询将进行完整的 table 扫描以进行连接,并且对于数十亿行,这将非常非常慢。
http://use-the-index-luke.com/ 对索引进行了很好的介绍,但是关于该主题的书籍和文章数不胜数。
1a) 对其他慢速查询重复#1。看看你是否可以改进它们。如果您处理过许多缓慢的查询并且无法加快它们的速度,请继续进行服务器调优。
2) 调整您的服务器。 Bill Karwin 的链接在那里会有帮助。
3) 查看增加 hardware/RAM。这应该只是最后的手段。
与#1 共度时光。它可能 return 物超所值。你可以做很多事情来改善事情而不花一毛钱。您还将学习如何编写更好的查询和创建更好的索引,并防止将来出现这些问题。
另外:听听 Bill Karwin 和他的知识。他是大写E的专家
在对 600 个相当随机的 table 的调查中(有几个比你的大得多),你的 230GB:80GB 比率大约在第 99 个百分位数。请提供 SHOW CREATE TABLE
以便我们讨论您是 "doing something wrong",还是仅仅是极端情况。 (很少有 6 列索引是可取的。如果它是 单个 索引总计 230GB,则为 'wrong'。)
我见过更大的 tables 运行 在较小的机器上很好。如果您主要做 "point queries",则几乎没有大小限制。如果您使用的是 UUID,那您就完蛋了。也就是说,它实际上取决于数据、查询、模式、月相、您的业力等。
一个交叉连接可以轻松完成一万亿件事情要做。使用 eq_ref 的连接通常不会比没有连接的查询慢多少。
"You can't tune your way out of a performance problem." "Throwing hardware at a performance problem either wastes money, or delays the inevitable." 相反,让我们看看 "queries that are slowing down",以及 EXPLAIN SELECT ...
和 SHOW CREATE TABLE
。
这是数据仓库应用程序吗?你有汇总表吗?
这是我的Cookbook on creating indexes。但如果您向我们展示您的代码,它可能会更快。
我可以提供另一个 Tuning Analysis .
EXPLAIN SELECT ..... 是调查您的协助请求所需信息的关键部分。
SHOW CREATE TABLE 为每个 table 参与也有帮助。
此时,在用户可用的数据中均不可见......
我的公司有一个 mySQL 服务器供一个分析师团队使用(通常一次 3-4 个)。最近查询速度变慢了,其中一些查询甚至需要几天时间,因为数据库有 table 多达 10 亿行(10^9 条记录)。
- 服务器主要特点: Linux OS-64 GB 内存- 3 TB 硬盘。
我们对微调一无所知,因此欢迎任何 tool/rule 找出导致问题的原因或至少缩小问题范围的经验。
去 Workbench studio>Table inspector 我发现了我们最常使用的数据库的这些关键值:
- 数据库大小: ~500 GB
- 最大 table 大小:~80 GB
- 索引长度(最大table):~230 GB。该索引依赖6个字段。
- 几乎没有 MyISAM table,所有 InnoDB
理想情况下,我想以最简单的方式微调服务器(更好)、数据库(更差)或两者(将来),以加快速度。
我的问题:
- 这些值(500、80、230 GB)是否正常且可管理? 中型服务器?
- 索引大小为 -230Gb- 比 table 本身大很多正常吗?
- 可以调整什么 parameters/strategy 来解决这个问题?我正在考虑内存日志或购买服务器 RAM,但很乐意调查任何明智的答案。
非常感谢。
我会尽力回答您的问题,但请记住,我不是 MySQL 专家。
1) 这是一个相当大的数据库,有很大的 table,但没有什么是相当大的服务器无法处理的。但这实际上取决于您的工作量。
2) 索引大小大于 table 本身很有趣,但它可能是 table 上所有索引的大小。那样的话就完全正常了。
3) 服务器中 64 GB 的 RAM 意味着可能会进行大量磁盘操作,这肯定会减慢您的速度。因此,添加一些内存肯定会有所帮助。也许检查查询是 运行 iotop 时服务器的行为方式。并将其与顶部的信息进行比较,以查看服务器是否正在等待磁盘。
如果您正在管理这种规模的 MySQL 实例,那么值得您花时间阅读 High Performance MySQL,这是关于 MySQL 调整的最佳书籍。我强烈建议你得到这本书并阅读它。
您的 InnoDB 缓冲池可能仍处于默认大小,没有利用 Linux 系统上的 RAM。如果您没有配置 MySQL 使用它,那么您有多少 RAM 都没有关系!
还有其他重要的调整参数。 MySQL 5.7 Performance Tuning Immediately After Installation 是对最重要的调整选项的精彩介绍。
索引 可以 大于 table 本身。将近 4 比 1 的比例很不寻常,但不一定是坏事。这取决于您需要什么索引,除非您考虑需要针对此数据 运行 的查询,否则无法知道这一点。
我做了演示How to Design Indexes, Really a few years ago (it's just as relevant to current versions of MySQL). Here's the video: https://www.youtube.com/watch?v=ELR7-RdU9XU
这是您要检查的顺序:
1) 调整索引。选择一个常用的慢查询并分析它。了解 EXPLAIN ANALYZE 以便您可以判断您的查询是否正确使用了索引。完全有可能您的 table 未正确编入索引,而您几天的查询可能 运行 在几分钟内。字面上地。如果没有适当的索引,您的查询将进行完整的 table 扫描以进行连接,并且对于数十亿行,这将非常非常慢。
http://use-the-index-luke.com/ 对索引进行了很好的介绍,但是关于该主题的书籍和文章数不胜数。
1a) 对其他慢速查询重复#1。看看你是否可以改进它们。如果您处理过许多缓慢的查询并且无法加快它们的速度,请继续进行服务器调优。
2) 调整您的服务器。 Bill Karwin 的链接在那里会有帮助。
3) 查看增加 hardware/RAM。这应该只是最后的手段。
与#1 共度时光。它可能 return 物超所值。你可以做很多事情来改善事情而不花一毛钱。您还将学习如何编写更好的查询和创建更好的索引,并防止将来出现这些问题。
另外:听听 Bill Karwin 和他的知识。他是大写E的专家
在对 600 个相当随机的 table 的调查中(有几个比你的大得多),你的 230GB:80GB 比率大约在第 99 个百分位数。请提供 SHOW CREATE TABLE
以便我们讨论您是 "doing something wrong",还是仅仅是极端情况。 (很少有 6 列索引是可取的。如果它是 单个 索引总计 230GB,则为 'wrong'。)
我见过更大的 tables 运行 在较小的机器上很好。如果您主要做 "point queries",则几乎没有大小限制。如果您使用的是 UUID,那您就完蛋了。也就是说,它实际上取决于数据、查询、模式、月相、您的业力等。
一个交叉连接可以轻松完成一万亿件事情要做。使用 eq_ref 的连接通常不会比没有连接的查询慢多少。
"You can't tune your way out of a performance problem." "Throwing hardware at a performance problem either wastes money, or delays the inevitable." 相反,让我们看看 "queries that are slowing down",以及 EXPLAIN SELECT ...
和 SHOW CREATE TABLE
。
这是数据仓库应用程序吗?你有汇总表吗?
这是我的Cookbook on creating indexes。但如果您向我们展示您的代码,它可能会更快。
我可以提供另一个 Tuning Analysis .
EXPLAIN SELECT ..... 是调查您的协助请求所需信息的关键部分。
SHOW CREATE TABLE 为每个 table 参与也有帮助。
此时,在用户可用的数据中均不可见......