问题背景
前段时间,被紧急调到一个新项目,支撑新项目的开发。跌跌撞撞之下,项目也正常上线了,期间收获颇多,无论是业务上的,还是业务之外的。业务上的就不多说了,不具通用性,意义不大,有一点业务之外的东东给我的感触比较深,特记录下来,与大家分享下 :查询优化。
查询优化
完整示例工程: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)
);
记录顾客的每一次存款,该表只会有数据的插入,不会有数据的删、改。表中数据如下

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

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

被折叠的 条评论
为什么被折叠?



