Skip to content

【性能】大幅提升数组内主表查询性能

Compare
Choose a tag to compare
@TommyLemon TommyLemon released this 31 Jan 16:08
· 933 commits to master since this release

解决 bug

解决 "toId%": "0,10" 等连续范围报错 value 类型不合法;
解决 "id{}@": "[]/Moment/praiseUserIdList" 等引用赋值的值有时类型为 List 时报错 ArrayList cannot be cast to JSONArray;
解决 "key<>": "a" 这种包含字符串的格式报错 Data truncation: Invalid JSON text,原来必须里面再用 "" 包装一次,JSON 中还得转义,现在简化成直接写即可;

增强安全

对 MySQL 的 DELETE 和 UPDATE 强制加 LIMIT,限制一次操作记录的数量;

提升性能

通过缓存及复用数组主表 ObjectParser 来大幅提升大量数据的数组内主表的查询性能;
通过减少不必要的 newSQLConfig 及 getSQL 等步骤来大幅提升大量数据的数组内主表的查询性能;

对比 4.5.2 在 Log.DEBUG = true(开启日志)的情况下

TestRecord[] 耗时降低至原来 24%,性能提升 300% 至原来 4 倍;
Moment[] 耗时降低至原来 33%,性能提升 200% 至原来 3 倍;
朋友圈列表耗时降低至原来 77%,性能提升 23% 至原来 1.2 倍。
其中每个数组都按 100 条来测试,如果每页数量更大或每项数据量更大,则提升会更加明显。

腾讯 CSIG 某项目线上生产环境实测 Log.DEBUG = false 时 2.3KW 大表(由两张等量拆分表组成)查询

LIMIT 100 相比原来从 2s 降到 164ms 提升 11 倍;
LIMIT 1000 相比原来从 30s 降到 197ms 提升 151 倍;
LIMIT 10000(一次 /get 到 1W 条记录) 整个网络请求耗时仅 633ms;
LIMIT 1000000(带条件一次 /get 到 12W+ 条记录共 72.5M 数据,CURL 下载速度 20M/s) 整个网络请求仅 5.624s,实际服务执行仅 2s。

兼容性

这个版本重构了几个方法:

1.Parser.createObjectParser
Parser createObjectParser(JSONObject request, String parentPath, String name, SQLConfig arrayConfig, boolean isSubquery) throws Exception;

删除 1 个参数 String name 新增 2 个参数 boolean isTable, boolean isArrayMainTable 后为

Parser createObjectParser(JSONObject request, String parentPath, SQLConfig arrayConfig, boolean isSubquery, boolean isTable, boolean isArrayMainTable) throws Exception;

2.AbstractParser.createObjectParser
AbstractObjectParser createObjectParser(JSONObject request, String parentPath, String name, SQLConfig arrayConfig, boolean isSubquery) throws Exception

删除 1 个参数 String name 新增 2 个参数 boolean isTable, boolean isArrayMainTable 后为

AbstractObjectParser createObjectParser(JSONObject request, String parentPath, SQLConfig arrayConfig, boolean isSubquery, boolean isTable, boolean isArrayMainTable) throws Exception

3.ObjectParser.parse
ObjectParser parse() throws Exception;

新增 2 个参数 String name, boolean isReuse 后为

ObjectParser parse(String name, boolean isReuse) throws Exception;

4.AbstractObjectParser.parse
AbstractObjectParser parse() throws Exception;

新增 2 个参数 String name, boolean isReuse 后为

AbstractObjectParser parse(String name, boolean isReuse) throws Exception;

5.AbstractObjectParser 的构造方法
public AbstractObjectParser(@NotNull JSONObject request, String parentPath, String name, SQLConfig arrayConfig, boolean isSubquery) throws Exception

删除 1 个参数 String name 新增 2 个参数 boolean isTable, boolean isArrayMainTable 后为

public AbstractObjectParser(@NotNull JSONObject request, String parentPath, SQLConfig arrayConfig, boolean isSubquery, boolean isTable, boolean isArrayMainTable) throws Exception

具体见

a406242