You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于两张表的MySQL分组查询优化技术求助

优化MySQL费用审批查询的实用建议

嘿,既然你的查询已经能正常运行但还有优化空间,咱们先结合你的业务场景拆解几个通用优化方向,要是能补充下现有查询语句和两张表的具体字段/索引情况,我还能给你更精准的调整方案~

一、先从索引下手(最见效的优化点)

  • 给关联字段加索引:如果你的查询经常关联tblExpenses和tblApproval(比如通过费用ID、员工ID关联),一定要给这些关联字段加普通索引,比如tblApproval里关联tblExpenses的外键字段(比如expense_id)。
  • 给过滤高频字段加索引:status是你常用的筛选条件,给它单独加个索引,或者和其他常用过滤字段(比如审批时间approval_time)建联合索引,比如(status, approval_time),能大幅提升状态筛选+时间范围查询的速度。
  • 避免冗余索引:如果已经有联合索引覆盖了常用查询字段,就别重复加单字段索引,比如已经有(expense_id, status),就不用单独给status加索引了。

二、优化查询语句本身

  • 别用SELECT *,只查需要的字段:比如你要拿员工费用金额和审批状态,就写SELECT e.amount, a.status FROM tblExpenses e JOIN tblApproval a ON e.id = a.expense_id,减少不必要的数据传输。
  • 选对JOIN类型:如果每个提交的费用都对应一条审批记录,用INNER JOIN比LEFT JOIN更高效;只有当你需要包含还没提交到审批层的费用时,再用LEFT JOIN。
  • 别在WHERE子句里对字段做函数操作:比如别写WHERE DATE(a.approval_time) = '2024-05-01',改成WHERE a.approval_time BETWEEN '2024-05-01 00:00:00' AND '2024-05-01 23:59:59',这样能用到approval_time上的索引。

三、针对status字段的细节优化

  • 把status改成枚举类型:因为它只有1-4四个固定值,改成ENUM('新建','待核实','已付款','已驳回')(或者保持INT但加字段注释),既能节省存储空间,查询过滤的效率也会更高(枚举内部用整数存储,比字符串快)。
  • 分组统计用覆盖索引:如果经常要统计各状态的费用数量,比如SELECT status, COUNT(*) FROM tblApproval GROUP BY status,建个覆盖索引(status),MySQL可以直接从索引里取数,不用回表查原数据。

举个优化示例(假设场景)

如果你的原查询是:

SELECT * FROM tblExpenses e LEFT JOIN tblApproval a ON e.id = a.expense_id WHERE a.status = 3

优化后可以改成:

SELECT e.id, e.expense_name, e.amount, a.approver, a.approval_time 
FROM tblExpenses e 
INNER JOIN tblApproval a ON e.id = a.expense_id 
WHERE a.status = 3

同时给tblApproval建联合索引(expense_id, status),查询速度会明显提升~

内容的提问来源于stack exchange,提问作者Bala

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:28:52