说我有一张order
桌子
id | clientid | type | amount | itemid | date
---|----------|------|--------|--------|-----------
23 | 258 | B | 150 | 14 | 2012-04-03
24 | 258 | S | 69 | 14 | 2012-04-03
25 | 301 | S | 10 | 20 | 2012-04-03
26 | 327 | B | 54 | 156 | 2012-04-04
clientid
是返回client
表的外键itemid
是返回item
表的外键type
只是B
或S
amount
是一个整数
processed
和一张桌子
id | orderid | processed | date
---|---------|-----------|---------
41 | 23 | true | 2012-04-03
42 | 24 | true | 2012-04-03
43 | 25 | false | <NULL>
44 | 26 | true | 2012-04-05
我需要从中获取所有相同的行,它们order
具有相反的值。请记住,只能有两个值之一 -或。在上面的示例中,这将是 rows和。clientid
date
type
type
B
S
23
24
另一个约束是 in 中的对应行processed
必须true
是orderid
.
到目前为止我的查询
SELECT c1.clientid,
c1.date,
c1.type,
c1.itemid,
c1.amount,
c2.date,
c2.type,
c2.itemid,
c2.amount
FROM order c1
INNER JOIN order c2 ON c1.itemid = c2.itemid AND
c1.date = c2.date AND
c1.clientid = c2.clientid AND
c1.type <> c2.type AND
c1.id < c2.id
INNER JOIN processed p1 ON p1.orderid = c1.id AND
p1.processed = true
INNER JOIN processed p2 ON p2.orderid = c2.id AND
p2.processed = true
问题:将processed = true
as 作为连接子句的一部分会减慢查询速度。如果我将其移至 WHERE 子句,则性能会好得多。这激起了我的兴趣,我想知道为什么。
主键和相应的外键列被索引,而值列(value
等processed
)没有。
免责声明:我继承了这个数据库结构,性能差异大约是 6 秒。