结合实际项目,谈谈如何进行SQL查询优化

本文通过一个实际项目案例,探讨如何进行SQL查询优化。问题始于一个需要展示额度记录的分页列表,初期的SQL查询在数据量增大时性能急剧下降。通过分析,发现IF函数和GROUP BY对查询效率的影响,并提出了使用CASE...WHEN...THEN替换IF,以及利用自联避免GROUP BY的方法。此外,还讨论了表设计和业务协调在优化中的作用,强调结合业务场景写出高效SQL的重要性。
摘要由CSDN通过智能技术生成

问题背景

前段时间,被紧急调到一个新项目,支撑新项目的开发。跌跌撞撞之下,项目也正常上线了,期间收获颇多,无论是业务上的,还是业务之外的。业务上的就不多说了,不具通用性,意义不大,有一点业务之外的东东给我的感触比较深,特记录下来,与大家分享下 :查询优化。

查询优化

完整示例工程:data-init,包括数据库表的 ddl 和 dml,以及数据批量的生成

相关表

涉及的表不多,一共三张:额度表、记录表 、 存款表

额度表 t_custmor_credit

CREATE TABLE t_customer_credit (
  id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  login_name VARCHAR(50) NOT NULL COMMENT '名称',
    credit_type TINYINT(1) NOT NULL COMMENT '额度类型,1:自由资金,2:冻结资金,3:优惠',
    amount DECIMAL(22,6) NOT NULL DEFAULT '0.00000' COMMENT '额度值',
    create_by VARCHAR(50) NOT NULL COMMENT '创建者',
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    update_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',
    update_by VARCHAR(50) NOT NULL COMMENT '修改者',
  PRIMARY KEY (id)
);

记录每个顾客的当前额度,额度一共分三种:自由资金、冻结资金和优惠,也就是说每个顾客会有 3 条记录来表示他的各个额度。表中数据如下

额度记录 t_custmor_credit_record

CREATE TABLE t_customer_credit_record (
  id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  login_name VARCHAR(50) NOT NULL COMMENT '名称',
    credit_type TINYINT(1) NOT NULL COMMENT '额度类型,参考t_custmor_credit的credit_type',
    bill_no VARCHAR(50) NOT NULL COMMENT '订单号',
    amount_before DECIMAL(22,6) NOT NULL DEFAULT '0.00000' COMMENT '前额度值',
    amount_change DECIMAL(22,6) NOT NULL DEFAULT '0.00000' COMMENT '额度变化值',
    amount_after DECIMAL(22,6) NOT NULL DEFAULT '0.00000' COMMENT '后额度值',
    create_by VARCHAR(50) NOT NULL COMMENT '创建者',
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    remark VARCHAR(500) NOT NULL DEFAULT '' COMMENT '备注',
  PRIMARY KEY (id)
);

记录顾客额度的每一次变化,只要有额度变化(不管是哪个额度进行了变化),都会新增3条记录,每个类型的额度都会新增一条记录。另外,该表只会有数据的插入,不会有数据的删、改。表中数据如下

存款表 t_custmor_deposit

CREATE TABLE t_customer_deposit (
  id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键',
  login_name VARCHAR(50) NOT NULL COMMENT '名称',
    bill_no VARCHAR(50) NOT NULL COMMENT '订单号',
    amount DECIMAL(22,6) NOT NULL DEFAULT '0.00000' COMMENT '存款金额',
    deposit_state TINYINT(1) NOT NULL COMMENT '存款状态: 1成功,2失败,3未知',
    channal TINYINT(2) NOT NULL COMMENT '存款渠道: 1:银联,2支付宝,3微信',
    create_by VARCHAR(50) NOT NULL COMMENT '创建者',
    create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    remark VARCHAR(500) NOT NULL DEFAULT '' COMMENT '备注',
  PRIMARY KEY (id)
);

记录顾客的每一次存款,该表只会有数据的插入,不会有数据的删、改。表中数据如下

产品需求

分页展示如下列表(具体的过滤条件就不列了,我们就当是初始状态,还未输入过滤条件)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值