设为首页 收藏本站
查看: 837|回复: 0

[经验分享] SQL优化-子查询&case&limit

[复制链接]

尚未签到

发表于 2018-10-20 09:36:20 | 显示全部楼层 |阅读模式
  load 导数据.notesdxtdb 数据库    total_time  475.60秒。 监控服务:仓颉
DSC0000.png select t_.*,

  a.name acquirer_name,
  m.merchant_name,
  am.merchant_name acq_merchant_name,
  ag.name agency_name
  from
  (
  select t.* ,
  c.cardbin_name,
  c.issuer_name cardbin_issuer_name,
  CASE c.card_type
  WHEN 'debit' THEN 'XXX'
  WHEN 'prepaid' THEN 'XXX'
  WHEN 'credit' THEN 'XXX'
  WHEN 'semiCredit' THEN 'XXX'
  END 'card_type'
  from trans_history t
  join dict_cardbin c on t.cardbin_id = c.id
  where 1=1  order by t.id desc ) t_
  left join cm_merchant m on t_.merchant_id=m.id
  left join acquirer a on t_.acquirer_id = a.id
  left join acq_merchant am on t_.acq_merchant_id = am.id
  left join agency ag on m.agency_id = ag.id
  order by t_.id desc  limit 0, 20;
  表:
  trans_history t
  子查询的 结果集是  t_
  dict_cardbin c
  cm_merchant m
  acquirer a
  acq_merchant am
  agency ag
  关联:
  c on t.cardbin_id = c.id
  t_.merchant_id=m.id
  t_.acquirer_id = a.id
  t_.acq_merchant_id = am.id
  m.agency_id = ag.id
  子查询结果集要:
  c.cardbin_name,
  c.issuer_name
  cardbin_issuer_name,
  外部结果要:
  t_.*,
  c.cardbin_name,
  c.issuer_name
  t.cardbin_issuer_name,
  a.name acquirer_name,
  m.merchant_name,
  am.merchant_name
  t.acq_merchant_name,
  ag.name agency_name
  以下SQL未经验证,全凭个人经验 对其SQL改写。
  (刚来新公司,还没有权限登录 跟查验表结构 执行计划。)
  目测 第一步设计的6个表的left join  以及判断
  第二步  如这个查询业务功能上来说 属于频繁性的,需要设计视图方式解决。
  视图采用 CASCADED 方式。
  查询需要:
  trans_history t  全字段数据;   其他表 都个需要某几个字段数据。
  select t.*,c.cardbin_name,c.issuer_name,t.cardbin_issuer_name,a.name acquirer_name,m.merchant_name,am.merchant_name,t.agency_name from ((((trans_history t join dict_cardbin c on t.cardbin_id = c.id ) left join cm_merchant m on t.merchant_id=m.id) left join acquirer a on t.acquirer_id = a.id ) left join acq_merchant am on t.acq_merchant_id = am.id ) left join agency ag on m.agency_id = ag.id order by t.id desc  limit 0, 20;
  card_type 列要做运算。这里 应该存 enum  0;1;2;3 这样的字段,逻辑端拿到数值,前端做渲染。  否则 这个CASE 没办法在第一个版本当中优化掉。
  card_type 字段,我这里就简写了。没有加入case 判断。
  select t.*,c.cardbin_name,c.issuer_name,a.name,acquirer_name,m.merchant_name,am.merchant_name,t.agency_name from ((((trans_history t join dict_cardbin c on t.cardbin_id = c.id ) left join cm_merchant m on t.merchant_id=m.id) left join acquirer a on t.acquirer_id = a.id ) left join acq_merchant am on t.acq_merchant_id = am.id ) left join agency ag on m.agency_id = ag.id order by t.id desc  limit 0, 20;

  select t.*,c.cardbin_name,c.issuer_name,t.cardbin_issuer_name,c.card_type,a.name acquirer_name,m.merchant_name,am.merchant_name,t.agency_name from ((((trans_history t join dict_cardbin c on t.cardbin_id = c.id ) left join cm_merchant m on t_.merchant_id=m.id) left join acquirer a on t_.acquirer_id = a.id ) left join acq_merchant am on t_.acq_merchant_id = am.id ) left join agency ag on m.agency_id = ag.id order by t.id desc  where>  视图方式:
  LOCAL只要满足本视图的条件就可以更新;
  CASCADED则必须满足所有针对该视图的所有视图的条件才可以更新
  create view card as select t.*,c.cardbin_name,c.issuer_name,t.cardbin_issuer_name,a.name acquirer_name,m.merchant_name,am.merchant_name,t.agency_name from ((((trans_history t join dict_cardbin c on t.cardbin_id = c.id ) left join cm_merchant m on t_.merchant_id=m.id) left join acquirer a on t_.acquirer_id = a.id ) left join acq_merchant am on t_.acq_merchant_id = am.id ) left join agency ag on m.agency_id = ag.id with local check option;
  解决哪些问题:
  1 解决了 表结构类型的问题。使用了enum  并利用前端做判断展示出来。
  2 解决了子查询 用left join方式替换。
  3 解决了limit 查询效率差的问题,用where 解决。


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-623914-1-1.html 上篇帖子: Cent OS 7 编译安装 My SQL 5.7 下篇帖子: SQL Server并发处理存在就更新七种解决方案
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表