背景
订单表:
订单地址表:保存了订单的地址信息,如发货仓库、发货线路等,是订单表和仓库表(发货线路表)的关联表。订单表和订单地址表是1:1,订单地址表和仓库表(发货线路表)是n:1。
订单标签表:保存了订单与表的关系;订单:标签是m : n
需求
通过仓库、线路或订单标签查询订单
原方案
1、通过仓库(线路)在订单地址表里查出订单Id集合A
2、通过标签在订单标签表里查出订单Id集合B
3、查询订单是通过订单id in 查询
问题
随着数据量增加,in 条件的值不可预估,in条件过多导致的效率缓慢
解决方案
1、订单表冗余仓库id、仓库名称
2、根据标签查询时改造为left join查询
SELECT DISTINCT (o1.id) id, o1.order_no FROM order o1 LEFT JOIN label ON o1.id = label.order_id WHERE o1.deleted = 0 AND o1.warehouse_id = ? AND label.label_id IN (?, ?)