后台 手动 join
数据库表: table1 table2 table3
假设不能数据库join ,计算量放在应用服务器上.
搜索条件:
可能三个搜索条件
table1Conditiontable2Condition table3Condition
这三个都是命中筛选度高的索引条件(定义为
强索引).
table1ConditionB
这个索引无法命中高筛选度的索引(定义为
弱索引).比如说一个条件能获取到几百万条数据.直接拖垮性能.
难点:
两个1 2表上的弱索引 ,3表上的字段排序.
这种应该使用读写分离,搞一个宽表数据库.不要用mysql 然后去查,或者搜索引擎也行.
解析: B+树是按照插入的先后顺序排序的. 对于非unique索引. 对于unique索引是按照大小排序的.
所以输入 时间条件搜索得到的结果并不是按照 id顺序排序的. 假设时间可更改的话. 但如果更改不大,总体上还是
按id字段(新建的先后顺序)排序.
结论: 性能和功能上进行选择!
1. 按照自然排序. 不限制order by id
2. 想要时时任意字段排序 最好某个条件输入后得到的结果数不多,否则就应该限制输入的时间区间.
智能化或者人工调整区间限制.
3. 通过离线计算排序.
第一步:
在性能考量下,设定好搜索条件限制. 确保强索引限制
1.1 自然排序
1.2 可自由根据某个字段排序. 这个区间限制比较强.
第二步:
根据输入的条件选择一个强索引条件.
OR 无强索引,返回必须要设置筛选区间.
OR 无输入或者默认一个筛选区间
第三步:
1. 建立所有表的Dao 外加外键ins List . 定义联结图
2. 建立Service ,然后设置bean
3. 建立搜索Bean,定义各外键list的值
第四步:
1 选择好"强索引"条件选择Dao搜索得到某主键List. 设置 xxIds
(1) for each xxids
2 根据join的连接图选择dao执行顺序. 如果得到的结果为零.直接返回. 不往下执行,避免ids 不是搜索条件得到所有的结果
3. bean合并 查看是作连接图是左连接还是右连接. 有搜索条件时是inner连接,无搜索条件时是右链接. 这是什么鬼.
4.计算是否得到limit m .返回.
或者: 不根据图来进行选择执行顺序. 根据业务的连接图,自己选择一个中心的顺序. 这样就不用工具类了.
1. 图节点类
Node {
Map<Node,Merge> maps;
public <R,P> R query(P param);
}
2. 联结合并设置.
Merge{
public <Key ,P1>Key getMainNodeKey(p1);
public <R,P1,P2> R merge(P1,List<P2>);
public <Key ,P2> getAttachedNodeKey(p1);
其中 P1是最终Bean,P2是dao层查询的Bean
}
3. 联结工具类.
将两个节点返回的List,合并.
3.1 第一步将某个list ,利用Merge获取key 变成 mulitiMap
3.2 forEach 某个list
List<Bean2> multiMap.get( Merge.getMainKey(bean))
将两个类合并.
for( List<Bean>){
Merge.merge(bean1, List<Bean2>);
}