Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Knex和PostgreSQL select查询在多个并行请求上的性能极为下降 简言之_Javascript_Node.js_Performance_Postgresql_Knex.js - Fatal编程技术网

Javascript Knex和PostgreSQL select查询在多个并行请求上的性能极为下降 简言之

Javascript Knex和PostgreSQL select查询在多个并行请求上的性能极为下降 简言之,javascript,node.js,performance,postgresql,knex.js,Javascript,Node.js,Performance,Postgresql,Knex.js,我正在开发一个游戏(梦想),我的后端堆栈是Node.js和带有Knex的PostgreSQL(9.6)。我在这里保存了所有球员的数据,我需要经常请求。 其中一个请求需要进行10次简单的选择以提取数据,这就是问题的根源:如果服务器同时只提供1个请求,那么这些查询相当快(~1ms)。但是,如果服务器并行处理多个请求(100-400),则查询执行时间会大大缩短(每次查询最多几秒钟) 细节 为了更加客观,我将描述服务器的请求目标、选择查询和收到的结果 关于系统 我在数字海洋4cpu/8gb液滴和Post

我正在开发一个游戏(梦想),我的后端堆栈是Node.js和带有Knex的PostgreSQL(9.6)。我在这里保存了所有球员的数据,我需要经常请求。 其中一个请求需要进行10次简单的选择以提取数据,这就是问题的根源:如果服务器同时只提供1个请求,那么这些查询相当快(~1ms)。但是,如果服务器并行处理多个请求(100-400),则查询执行时间会大大缩短(每次查询最多几秒钟)

细节 为了更加客观,我将描述服务器的请求目标、选择查询和收到的结果

关于系统 我在数字海洋4cpu/8gb液滴和Postgres上运行节点代码,配置相同(2个不同的液滴,配置相同)

关于请求 它需要做一些游戏操作,他从DB中为2名玩家选择数据

DDL 球员数据由5个表表示:

创建表public.player\u配置文件(
id integer NOT NULL默认值nextval('player_profile_id_seq'::regclass),
公共_数据整数不为空,
私有_数据整数不为空,
当前\u活动\u组\u num smallint非空默认值“0”::smallint,
在bigint处创建的_不为NULL默认值“0”::bigint,
约束播放器\配置文件\ pkey主键(id),
约束播放器\配置文件\私有\数据\外键(私有\数据)
引用public.profile\u private\u数据(id)匹配简单
更新时不执行任何操作
在删除“无操作”时,
约束播放器\配置文件\公共\数据\外键(公共\数据)
引用public.profile\u public\u数据(id)匹配简单
更新时不执行任何操作
不删除任何操作
);
创建表public.player\u character\u数据(
id integer NOT NULL默认值nextval('player_character_data_id_seq'::regclass),
所有者\玩家整数不为空,
字符\u id整数不为空,
经验\u计数器整数不为空,
级别\u计数器整数不为空,
字符名称字符变化(255)整理pg_目录。“默认”不为空,
在bigint处创建的_不为NULL默认值“0”::bigint,
约束播放器\字符\数据\ pkey主键(id),
约束播放机\字符\数据\所有者\播放机\外键(所有者\播放机)
参考public.player_配置文件(id)匹配简单
更新时不执行任何操作
不删除任何操作
);
创建表public.player_卡(
id integer非空默认值nextval('player_cards_id_seq'::regclass),
卡id整数不为空,
所有者\玩家整数不为空,
卡级别整数不为空,
第一组布尔值不为空,
整数不为空,
第二组布尔值不为NULL默认值为false,
第三组布尔值不为NULL默认值为false,
质量字符变化(10)核对pg_目录。“默认”非空默认值“无”::字符变化,
约束玩家卡密钥主键(id),
约束玩家\卡\所有者\玩家\外键(所有者\玩家)
参考public.player_配置文件(id)匹配简单
更新时不执行任何操作
不删除任何操作
);
创建表public.player\u character\u设备(
id integer NOT NULL默认值nextval('player_character_equipment_id_seq'::regclass),
所有者\u字符整数不为空,
项目id整数不为空,
item_级别整数不为空,
项目类型字符变化(20)对照pg_目录。“默认值”不为空,
配置了布尔值的值不为空,
槽数为整数,
约束玩家\角色\设备\ pkey主键(id),
约束玩家\角色\设备\所有者\角色\外键(所有者\角色)
引用public.player\u字符\u数据(id)匹配简单
更新时不执行任何操作
不删除任何操作
);
创建表public.player\u character\u符文(
id integer NOT NULL默认值nextval('player_character_runes_id_seq'::regclass),
所有者\u字符整数不为空,
项目id整数不为空,
槽数为整数,
衰减\开始\时间戳bigint,
约束玩家\角色\符文\ pkey主键(id),
约束玩家\角色\符文\所有者\角色\外键(所有者\角色)
引用public.player\u字符\u数据(id)匹配简单
更新时不执行任何操作
不删除任何操作
);
带索引
knex.raw('player\u cards\u owner\u player\u first\u deck\u index''在“player\u cards”(“owner\u player”)上创建索引“player\u cards\u owner\u player\u first\u deck\u index”,其中first\u deck=TRUE);
knex.raw('在“玩家卡”(“所有者-玩家”)上创建索引“玩家卡\所有者-玩家卡\第二副牌\索引”,其中第二副牌=TRUE');
knex.raw('在“玩家卡”(“所有者-玩家”)上创建索引“玩家卡\所有者-玩家卡\第三副牌\索引”,其中第三副牌=TRUE');
knex.raw(‘玩家角色装备’(‘所有者角色’)中的‘玩家角色装备’、‘所有者角色’、‘玩家角色装备’、‘所有者角色’、‘所有者角色’、‘所有者角色’、‘玩家角色装备’、‘所有者角色装备’、‘所有者角色装备’、‘所有者角色装备’、‘所有者角色装备’、‘所有者装备’、‘所有者角色装备’、‘所有者角色装备’、‘所有者装备装备装备’、‘所有者角色;
knex.raw('player_character_runes_owner_character_slot_num_not_null_index''在“player_character_runes”(“owner_character”)上创建索引,其中slot_num不为空);
代码 第一个问题
async.parallel([
cb=>tx('player\u character\u data')
.选择('character\u id','id')
.where('owner\u player',playerId)
.限额(1)
.asCallback(cb),
cb=>tx('player\u character\u data')
.选择('character\u id','id')
.where('owner\u player',enemyId)
.限额(1)
.asCallback(cb)
],callbackFn);
第二个问题
async.parallel([
cb=>tx('player_profile')
.选择('current\u active\u deck\u num')
.where('id',playerId)
.asCallback(cb),
cb=>tx('player_profile')
.选择('current\u active\u deck\u num')
.where('id',enemyId)
.asCallback(cb)
],callbackFn);
第三个问题
playerQ={first_deck:true}
enemyQ={first_deck:true}
卡组中的最大卡数=5
异步并行([
cb=>tx(“玩家卡”)