【慢Sql,耗时≈5s】

在Archery平台发现近期的一个慢sql:SELECT * FROM emax_order_detail WHERE import_order_no = ?

发现sql慢就加索引?非也!_sql

 经测试,的确是慢。SELECT * FROM emax_order_detail WHERE import_order_no = '1738120234847571968' 。尝试加上limit 1,依然超过5s。


【如何优化】

优化方式,直接的方式是在 import_order_no 上加索引。这也是头疼医头的方式。

有没有注意,emax_order_detail 已经有许多索引了。

发现sql慢就加索引?非也!_sql_02

 

 【发现问题就解决,往往是低效的方式】

我们对业务进行分析,程序稍作改动,下面sql执行性能提高数倍。

SELECT * FROM emax_order_detail WHERE create_time>='2023-12-17' and import_order_no = '1738120234847571968'

SELECT * FROM emax_order_detail WHERE enterprise_id=1700039047700220 and import_order_no = '1738120234847571968'

 

【一言以蔽之,企业开发中,理清业务,事半功倍,包括所执行的sql】

类似的慢sql有许多,

  • 定时任务 按进行中状态拿一批数据的sql
  • 三方通道回调,假定三方给的报文里只有三方自己的单号,按三方单号定位数据记录的sql
  • 三方通道回调,三方给的报文里包含我司单号、三方自己的单号,程序却直接用三方单号定位数据记录
  • 企业协议列表上的“查看保全合同”操作,传给auth的不是协议id,而是三方的合同编号。auth本可以通过协议id定位记录,却要通过三方的合同编号定位记录。
  • 企业开票记录里,保存的服务商发票类目id是服务商系统返回的id。查询发票类目名称时,传给channel的是服务商返回的发票类目id。channel本可以用自己的主键定位记录,结果却用服务商返回的发票类目id定位记录。
  • 我司提供给商户的查询交易回单的API,商户上送商户自己的订单号,我们程序直接根据商户单号定位记录。(本案)
  • 。。。

只要对业务稍加分析,我们程序就不会出现这么多慢sql。