【发布时间】:2017-12-23 15:15:28
【问题描述】:
我的公司有一个分析团队使用的 mySQL 服务器(通常一次 3-4 个)。最近,对于包含多达 10 亿行(10^9 条记录)的表的数据库,查询速度变慢了,其中一些甚至需要几天时间。
- 服务器主要特点: Linux OS-64 GB 内存- 3 TB 硬盘。
我们对微调一无所知,因此欢迎使用任何工具/经验法则来找出导致问题的原因或至少缩小问题范围。
Going to Workbench studio>Table inspector 我为我们最常使用的数据库找到了这些关键值:
- 数据库大小: ~500 GB
- 最大表大小:~80 GB
- 索引长度(对于最大的表):~230 GB。该索引依赖于 6 个字段。
- 几乎没有 MyISAM 表,都是 InnoDB
理想情况下,我想以最简单的方式对服务器(更好)、数据库(更差)或两者(将来)进行微调,以加快速度。
我的问题:
- 这些值(500、80、230 GB)是否正常且可管理? 中型服务器?
- 这种大小的索引 -230Gb- 比表本身大得多,这是否正常?
- 可以调整哪些参数/策略来解决此问题?我正在考虑内存日志或购买服务器 RAM,但很乐意调查任何合理的答案。
非常感谢。
【问题讨论】:
-
数据库调优是一项复杂的任务,不仅是服务器,查询也会影响性能。现在,除了 db 大小之外,您还没有告诉我们太多,所以我们在这里无能为力。告诉我们您的查询是什么,生成的计划是什么。性能问题应该包括
EXPLAIN ANALYZE和一些关于表大小、索引、当前时间性能、期望时间等的信息。Slow是一个相对术语,我们需要一个真实的值来比较。 MySQL -
公认的数据库调优很复杂,但我认为这些问题非常具体。我不包括 EXPLAIN_ANALYZE 因为我什至不知道那是什么。关于变慢:我说的是读取/加入表的查询(一个最多 10 亿条记录),正如所解释的那样需要 days (几天)运行(过去是几个小时,而DB 更小)。
-
致那些愿意关闭它的人:这可能不是服务器调优问题,主要是关于学习正确使用数据库。它应该保持打开状态。
-
我已经发布了
EXPLAIN PLAN的链接,如果您没有使用它,您的问题可能与索引有关,所以请先检查这些计划。还因为当数据库大小增加时,您的问题会变得最糟糕,这也指向您的查询进行全表扫描(再次坏索引)。您还可以使用分区来改善对大表的访问dev.mysql.com/doc/refman/5.7/en/partitioning-types.html
标签: mysql sql optimization database-administration database-tuning