【问题标题】:MySQL using SELECT in WHERE statement - best way?MySQL 在 WHERE 语句中使用 SELECT - 最好的方法?
【发布时间】:2016-03-24 10:57:03
【问题描述】:

我对 mysql 比较陌生,所以我希望你能指出我正确的方向。我有两张表,“产品”是关于我们要出售的商品的信息,“报价”表是我们销售该产品的各个供应商的定价和供应商信息。两个表都有相关的“sku”列。 'offers' 表中可以有多个供应商销售相同的 sku。

当我在 products 表中查询各种东西时,我只想要有供应商从“offers”表中销售它的结果。现在我正在使用如下查询:

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

对于有很多结果的查询,这可能需要比我想要的更长的时间。有没有更有效的方法来查询这两个表?也许加入?谢谢。

【问题讨论】:

  • 将其转换为 JOIN 语法可能具有与通常非常聪明的优化器相同的性能。谓词的数据类型和索引是什么? products.skuproducts.name
  • products.sku 是主键,所以它有自己的索引,offers.sku 也有自己的索引。两者的数据类型都是 CHAR(12),因为我们所有的 sku 都是 12 个字符长。
  • 您能否从查询中省略 sku 谓词以验证它是否确实是您的性能问题的原因?
  • SELECT products.* FROM products JOIN offers ON offers.sku = products.sku WHERE products.name = 'Iphone' 是 JOIN 语法,虽然我认为它不会帮助您解决性能问题,但可能值得进行测试。

标签: mysql select join


【解决方案1】:

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

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

索引sku 和过滤条件中使用的其他字段可能是您正在寻找的性能的巨大增益。

【讨论】:

  • @TimM 您是否将EXISTS 版本的性能与缓存结果进行比较?您的瓶颈可能是其他过滤条件,但 EXISTS 的性能应该与 IN 相同或更好。
  • 我已关闭查询缓存,因此我假设任何地方都没有缓存任何内容。但是使用存在使查询从大约 0.5 秒到大约 2 秒。
  • 这很好奇,我希望EXISTSJOIN 的表现相同,都比IN 更好,有据可查,但谁知道呢。我建议您在一个简短的运行查询中创建大量测试查询,以检查平均值,因为单个查询可能会因环境中的其他事物而异。
  • 非常感谢,是的,我也会做更多的测试和仔细检查索引。我只是希望有灵丹妙药可以大大提高速度。
猜你喜欢
  • 2011-01-12
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-07
  • 2016-12-29
  • 2011-09-19
  • 1970-01-01
相关资源
最近更新 更多