Mysql IN 大量ID优化方案

背景

订单表:

订单地址表:保存了订单的地址信息,如发货仓库、发货线路等,是订单表和仓库表(发货线路表)的关联表。订单表和订单地址表是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 (?, ?)
原文地址:https://www.cnblogs.com/zhangxianming/p/15336589.html