【发布时间】:2015-09-15 19:57:13
【问题描述】:
我正在查询电子商务网站中的 3 个表。
订单表:
id
order_number
name
etc...
order_lines 表:
id
order_number
sku
quantity
etc.
产品表
id
sku
title
ship_by (INT)
etc.
order_number 将 orders 表链接到 order_lines 表。 SKU 将 order_lines 表链接到 products 表。
请注意 products 表中的 ship_by 列,这表示将由哪个供应商发货。查询需要为特定供应商拉订单。订单可能包含由不同供应商销售的商品。
这是我拼凑起来的查询:
SELECT
orders.`order_number` as `orderId`,
orders.`shipping` as `fPostageCost`,
FROM_UNIXTIME(orders.`time`) as `dReceievedDate`,
(
CASE orders.`dob`
WHEN 'COURIER 3 DAY' THEN 'UK_SellersStandardRate'
WHEN 'COURIER 24 HOUR' THEN 'UK_OtherCourier24'
ELSE orders.`dob`
END
)
...(plus a number more)
FROM orders
INNER JOIN order_lines
ON orders.order_number = order_lines.order_number
WHERE
(
(SELECT COUNT(order_lines.sku)
FROM order_lines, products
WHERE order_lines.sku = products.sku
AND products.ship_by = 1
AND order_lines.order_number = orders.order_number) > 0
)
AND ( orders.`printed` = 'N' OR orders.`printed` IS NULL )
AND orders.status = 'Awaiting Despatch'
AND ( orders.payment_status = 'Success' OR orders.payment_status = 'Paypal Paid' OR orders.payment_status = 'Manual Payment' )
GROUP BY orders.`order_number`
ORDER BY orders.order_number ASC
执行查询大约需要 7 秒。
如果我从第二个 SELECT 查询中删除 'AND order_lines.order_number = orders.order_number' 行,它几乎会立即执行,但如果没有这一行,它就不能按我的需要工作。
除了将“ship_by”列添加到 order_lines 表中(我不想这样做,因为我必须更改很多 php 代码),有没有办法修改这个查询来加快它的速度?
查询是从 PHP 外部运行的,所以它必须是纯 mysql 查询。
这里是查询的解释:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY order_lines ALL NULL NULL NULL NULL 9627 Using temporary; Using filesort
1 PRIMARY orders eq_ref order_idx order_idx 17 .order_lines.order_number 1 Using where
2 DEPENDENT SUBQUERY order_lines ALL NULL NULL NULL NULL 9627 Using where
2 DEPENDENT SUBQUERY products ref sku_2,sku,sku_3 sku_2 63 order_lines.prod_code 11 Using where
谢谢
【问题讨论】: