HI!,你好,我是zane,zanePerfor是一款最近我开发的一个前端性能监控平台,如今支持web浏览器端和微信小程序段。html
我定义为一款完整,高性能,高可用的前端性能监控系统,这是将来会达到的目的,现今的架构也基本支持了高可用,高性能的部署。实际上还不够,在不少地方还有优化的空间,我会持续的优化和升级。前端
开源不易,若是你也热爱技术,拥抱开源,但愿能小小的支持给个star。git
github.com/wangweiange…
github
zanePerfor能够建立多个应用,并进行数据的上报统计。ajax
每一个应用同类型的数据存放在同一张表中会形成单表的数据存储量很是大,索引文件的体积相应的也会很大。小程序
在单表中,须要对每一个应用的appId作索引,若是分表此索引则可去掉。微信小程序
这样就形成了单表的读写性能都会相应的下降。浏览器
解决了单表的数据存储大小压力bash
解决了单表的读写压力
减小索引字段和索引体积大小
应用解耦与查询性能的提高
// 在app.js下挂载models对象
'use strict';
module.exports = async app => {
app.models = {};
};复制代码
'use strict';
module.exports = app => {
const mongoose = app.mongoose;
const Schema = mongoose.Schema;
const conn = app.mongooseDB.get('db3');
const WebAjaxsSchema = new Schema({
app_id: { type: String },
create_time: { type: Date, default: Date.now },
...
});
// ----------拆表代码以下:-----------
// 此处根据appId拆表
app.models.WebAjaxs = function(appId) {
return conn.model(`web_ajaxs_${appId}`, WebAjaxsSchema);
};
// ----------默认写法(不拆表)---------
// return conn.model(`web_ajaxs`, WebAjaxsSchema);
};复制代码
调用方式也很简单,跟默认的调用方式有一点小区别 (下面以调用单个ajax详情为例)
// 得到单个ajax详情信息
async getDetailForId(appId, id) {
// ---------拆表调用方式---------
return await this.app.models.WebAjaxs(appId).findOne({ _id: id }).read('sp').exec() || {};
// ---------默认调用方式---------
// return await this.ctx.model.WebAjaxs.findOne({ _id: id }).read('sp').exec() || {};
}复制代码
备注:应用根据appId拆表,所以全部查询操做须要传入appId进行查询。
以上只是实践的一种方式,同理,还能够经过 时间日期拆表,其余字段拆表。
zanePerfor暂时只作分表,暂未作分库,已经能知足绝大部分业务需求,若某一天以为不能知足业务需求的时候再考虑是否分库。
文章来源:zane的博客