大表的mysql性能问题

时间:2018-10-11 09:45:15

标签: mysql database-performance large-data

您的表很大-超过5亿条记录。该表已完全标准化。该表是一个innodb表。尽管查询已尽可能优化,但速度慢于可接受。即使该表已经很慢,但预计在接下来的6个月中它的大小将增加一倍。您会考虑采取什么措施来解决当前的性能问题,并使表中的数据有可能翻两番?

我了解到,如果查询速度很慢,则问题可能出在处理能力,RAM,光盘或服务器数量上。您能用儿童语言告诉云计算,负载平衡或增加RAM / CPU功能/光盘如何将如此大量的行的查询响应时间从7秒增加到1秒吗?假设您有X个服务器,Y个RAM和Z个CD容量的磁盘,这使我的查询响应时间为S1秒。如何更改X,Y,Z,C以将S1增加/减少1秒?

2 个答案:

答案 0 :(得分:1)

“表已完全归一化”-由于存在“过度归一化”之类的问题,我们来看看表的SHOW CREATE TABLE

  • 事实表(具有500M行的索引)上的许多索引会损害INSERT的性能。
  • 不应该对连续值(日期,日期时间,数字)进行标准化。当您需要搜索一系列这样的值时,归一化对造成了很大的伤害

“我了解到,如果查询速度很慢,则问题可能出在处理能力,RAM,光盘或服务器数量上。” -那是老妇人的故事。通常有一些方法可以改善查询和/或模式的索引和/或编制(如上所述)。

您熟悉“复合”索引吗?

“您能用儿童语言告诉云计算,负载平衡或增加RAM / CPU电源/光盘如何将如此大量的行的查询响应时间从7秒增加到1秒吗?”答:“这些都不会有帮助。” MySQL在一个CPU中执行一个查询,并且服务器上的I / O也可能是单线程的。并行性(您所暗示的)在MySQL中不存在。如果确实如此,则取决于用户编写代码,然后抱怨它并没有提供预期的帮助。

“那么最好将这些数据迁移到MongoDB或任何其他NoSQL db” –您遗漏了这一点。如果您需要读取500M行(甚至1M),则需要花费时间。没有使I / O更快的灵丹妙药。

很抱歉,但是有许多原理可以显着加快处理500M行的速度。

“汇总表”是数据仓库中的一大帮助。他们通常使事情快10倍。但是它们需要 you 来构建和维护它们。 (同样,由于缺乏有关您的用例的细节,我很模糊。)

“在99%的情况下出现堆栈溢出情况并非如此”,也许只有98%。

关于唯一可以使速度提高2倍的硬件修补程序,是用SSD替换旋转驱动器。在18年中,CPU的改进并不多。当您有64个连接时,64核会有所帮助,但在计时1个连接的延迟时却没有帮助。当所需的数据可以在多台服务器之间分离时,最好进行分片。

答案 1 :(得分:-1)

我建议启用slow query log并从记录需要5秒钟以上的查询开始。 来自日志的查询应进行性能分析。 在此回合之后,进行另一轮持续4,3,2,1秒。 完成此分析后,别忘了切换日志。

如果您仍然很慢,那么您可以考虑一下您的硬件-它是慢速SAN,还是普通硬盘,还是SD?之后,您可以考虑一下您的ram ...您是否需要更多,因为系统始终在交换?最后但并非最不重要的一点是,请考虑一下您的cpu ...但是也许您正处于狂暴的pi-通常很慢;-)