哪个更快-子查询中的条件还是整个返回结果的条件?例如:
SELECT *
FROM orders
LEFT JOIN clients USING (client_id)
LEFT JOIN products USING (products_id)
WHERE orders.orders_id < 50 AND clients.clients_id > 100 AND products.products_id IN (2,5,7,112)
OR
SELECT *
FROM (
SELECT * FROM orders WHERE orders_id < 50
)
LEFT JOIN (
SELECT *
FROM clients
WHERE clients_id > 100
) USING (client_id)
LEFT JOIN (
SELECT *
FROM products
WHERE products_id IN (2,5,7,112)
) USING (products_id)
谢谢!
问题是这些是不同的查询-要清楚
SELECT *
FROM orders
JOIN clients USING (client_id)
JOIN products USING (products_id)
WHERE clients_id > 100 AND products_id IN (2,5,7,112)
这是第一个查询的实际作用。
由于此数据集可能会小得多,因此它会更快返回(例如,仅10行而不是10k)-当您期望第二个数据集运行得更快时,这可能会令您感到震惊。这就是为什么。
由于在联接表中的列上使用了外部过滤器,所以它们成为内部联接。
在一般情况下,就哪个更快而言...取决于很多东西,索引,数据库拓扑,表大小等。
要在系统上进行从苹果到苹果的测试,请使用此查询作为第一个查询:
SELECT *
FROM orders
LEFT JOIN clients ON orders.client_id = clients.client_id
and clients.client_id > 100
LEFT JOIN products ON orders.products_id = products.products_id
and products.products_id IN (2,5,7,112)
或此查询作为您的第二个查询
SELECT *
FROM orders
JOIN (
SELECT *
FROM clients
WHERE clients_id > 100
) USING (client_id)
JOIN (
SELECT *
FROM products
WHERE products_id IN (2,5,7,112)
) USING (products_id)