您的表很大-超过5亿条记录。该表已完全标准化。该表是一个innodb表。尽管查询已尽可能优化,但速度慢于可接受。即使该表已经很慢,但预计在接下来的6个月中它的大小将增加一倍。您会考虑采取什么措施来解决当前的性能问题,并使表中的数据有可能翻两番?
我了解到,如果查询速度很慢,则问题可能出在处理能力,RAM,光盘或服务器数量上。您能用儿童语言告诉云计算,负载平衡或增加RAM / CPU功能/光盘如何将如此大量的行的查询响应时间从7秒增加到1秒吗?假设您有X个服务器,Y个RAM和Z个CD容量的磁盘,这使我的查询响应时间为S1秒。如何更改X,Y,Z,C以将S1增加/减少1秒?
答案 0 :(得分:1)
“表已完全归一化”-由于存在“过度归一化”之类的问题,我们来看看表的SHOW CREATE TABLE
。
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-通常很慢;-)