我正在使用NodeJs和Mysql。 我有一个查询将mysql表中的一个字段更新为:
Update messaging SET count = count + 1 WHERE msgId = 10;
我正在使用连接池。配置为:
var pool = mysql.createPool({
connectionLimit : 100,
host: config.mysql.host,
user: config.mysql.user,
password: config.mysql.password,
database: config.mysql.database,
port: 3306,
debug: false,
multipleStatements: true});
将消息传递给500万用户时,正在使用此查询的API起作用。 它使连接保持打开状态 。这导致服务器处理非常缓慢。 是否有其他解决方案可以提高服务器性能?
答案 0 :(得分:0)
矛盾的是,减少连接数通常可以提高性能。池连接是可串行重用的资源,并且存在连接请求队列。因此,DBMS不会一次尝试执行大量查询,而是一次处理少量查询,并按顺序处理负载。
因此,对于应该在短时间内运行的查询(如您的查询),请创建一个带有较小connectionLimit的池。尝试10。如果效果很好,请尝试5。
如果您还有其他查询需要更长的时间,则可能需要其他连接池。
更不用说集群节点应用程序将为集群的每个成员打开该数目的连接。对于几乎所有MySQL部署而言,400个连接都是太多的。 (如果您有一个可以处理数百个连接的部署,那么采购经理就知道了,因为这种部署非常昂贵。)
但是,您可能会遇到此问题:如果数百万用户正在完全更新同一行msgId = 10
,则该行将具有DBMS争用。在这种情况下,您可能希望存储该行的命中数,然后每隔几秒钟而不是每次命中执行一次UPDATE... SET count = count + n
。