很多人见到文章标题以为是标题党,带着半信半疑的心态进来看一下,有些高手想顺便打击一下!
我告诉你没有机会的!因为sqltoy是中国人创建的目前最强的orm框架,为中国新基建加油!
sqltoy-orm的开源地址: https://github.com/chenrenfei/sagacity-sqltoy
我们举一个简单的例子:
- 查询员工信息,
- 显示其:工号、姓名、岗位、部门、入职日期、手机号码、邮箱;
- 查询条件是:入职日期在2019年1月到2019年12月,姓陈的员工。
- 按照入职日期逆序
<code>select t1.STAFF_ID,t1.STAFF_NAME,t1.ORGAN_ID, -- 子查询岗位名称,应该还有性别等,这里简化一下 (select dict_name from sys_dict_detail where dict_type='POST_TYPE' and dict_key=t1.POST_CODE) postName, t2.ORGAN_NAME, t1.DUTY_DATE, t1.EMAIL, t1.MOBILE_NO from sys_staff_info t1 left join sys_organ_info t2 on t1.ORGAN_ID=t2.ORGAN_ID where t1.name like '陈%' and t1.DUTY_DATE>='2019-01-01' and t1.DUTY_DATE<='2019-12-31' order by t1.DUTY_DATE desc/<code>
- 传统的分页是怎么弄?
很多人的分页是不管三七二十一select count(1) from (上面这段sql)
- 再深入一点的考虑到了count优化和order by的干扰,基本上就觉得很强了
<code>select count(1) from sys_staff_info t1 left join sys_organ_info t2 on t1.ORGAN_ID=t2.ORGAN_ID where t1.name like '陈%' and t1.DUTY_DATE>='2019-01-01' and t1.DUTY_DATE <='2019-12-31'/<code>
- 我们再来优化,我们发现查询条件完全落在了员工信息表上:
通过 @fast() 实现内部先分页,select * from (select xx from tablex limit ? offset ?) t1 left join tabley t2。
其结果就是:先取符合条件的数据10条再跟其他表进行关联,减少关联数据的规模从而提升效率。
<code> select t1.*, (select dict_name from sys_dict_detail where dict_type='POST_TYPE' and dict_key=t1.POST_CODE) postName, t2.ORGAN_NAME from @fast(select STAFF_ID, STAFF_NAME, ORGAN_ID, POST_CODE, DUTY_DATE, EMAIL, MOBILE_NO from sys_staff_info where name like '陈%' and DUTY_DATE>='2019-01-01' and DUTY_DATE<='2019-12-31' order by t1.DUTY_DATE desc ) t1 left join sys_organ_info t2 on t1.ORGAN_ID=t2.ORGAN_ID /<code>
- 很多人觉得到这一步应该无法再优化了!我告诉你还有!
我们发现分页查询总是分成了2步:1)取count总记录;2)再取一页数据结果,总计有2次查询。我们有没有办法让2次查询变少?
sqltoy则提供了分页优化器:在一定时效内,查询条件一样利用缓存存放count数量,避免每次都2次查询
<code> =:beginDate and DUTY_DATE<=:endDate order by t1.DUTY_DATE desc ) t1 left join sys_organ_info t2 on t1.ORGAN_ID=t2.ORGAN_ID ]]> /<code>
- 到这一步的时候大家觉得肯定无法再优化了,这里引申一下第二讲最神奇的缓存翻译,我们预览一下最终效果:
看见没有:关联数据字典表、机构表都取消了,变成了单表查询,查询出结果后通过缓存将名字翻译出来。
<code> =:beginDate] #[and DUTY_DATE<=:endDate] order by t1.DUTY_DATE desc ]]> /<code>
怎么样?没有水分吧!动态条件sql是不是也很直观简洁!