后台 手动 join 的索引选择

后台 手动 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>);
        }
    
 
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值