2015-12-17 21 views
0

我对mysql比较新,所以我希望你能指出我的方向。我有两张表,'产品'是关于我们要销售的产品的信息,'产品'表是来自我们销售该产品的不同供应商的定价和供应商信息。两个表都有相关的'sku'列。 'offer'表中可以有多个供应商销售相同的sku。MySQL在WHERE语句中使用SELECT - 最佳方式?

当我查询产品表中的各种东西时,我只想要一个供应商从'offer'表中销售它的结果。现在我使用的查询关键词,比如:

SELECT * 
FROM products 
WHERE 
products.sku IN (SELECT offers.sku FROM offers) 
AND 
products.name = 'Iphone' 
AND 
blah..... 

这可能需要更长的时间比我要在具有许多结果的查询。有没有更有效的方法来查询这两个表?也许用JOIN?谢谢。

+1

将其转换为JOIN语法可能会具有与优化程序通常非常智能相同的性能。谓词中的数据类型和索引是什么? 'products.sku','products.name'等。 – Matthew

+0

products.sku是主键,因此它有自己的索引,而offers.sku也有它自己的索引。数据类型都是CHAR(12),因为我们所有的skus都是12个字符长。 –

+0

您可以忽略查询中的'sku'谓词以验证它实际上是导致性能问题的原因吗? – Matthew

回答

0

EXISTSJOIN可以比IN更高性能,但这不能保证您的优化器不会将以下内容视为与您的查询相同。

SELECT * 
FROM products 
WHERE EXISTS (SELECT 1 
       FROM offers 
       WHERE products.sku = offers.sku) 
AND  products.name = 'Iphone' 
AND blah..... 

索引sku和过滤标准使用等领域可能是在性能上的大收获,你要寻找的。

+0

这使性能变差了 –

+0

@TimM你是否比较了'EXISTS'版本与缓存结果?这可能是您的瓶颈是其他过滤标准,但是“EXISTS”应该与“IN”相同或更好。 –

+0

我有查询缓存关闭,所以我假设什么都没有被缓存在任何地方。但是使用存在使查询从约.5秒变为约2秒。 –