背景
訂單表:
訂單地址表:保存了訂單的地址信息,如發貨倉庫、發貨線路等,是訂單表和倉庫表(發貨線路表)的關聯表。訂單表和訂單地址表是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 (?, ?)