Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL在WHERE语句中使用SELECT-最佳方式?_Mysql_Select_Join - Fatal编程技术网

MySQL在WHERE语句中使用SELECT-最佳方式?

MySQL在WHERE语句中使用SELECT-最佳方式?,mysql,select,join,Mysql,Select,Join,我对mysql比较陌生,所以我希望你能给我指出正确的方向。我有两个表,“产品”是关于我们要出售的物品的信息,“报价”表是我们销售该产品的各个供应商的定价和供应商信息。两个表都有相关的“sku”列。“报价”表中可以有多个供应商销售相同的sku 当我查询products表中的各种内容时,我只希望得到供应商从“offers”表中销售产品的结果。现在我使用的查询如下: SELECT * FROM products WHERE products.sku IN (SELECT offers.sku FROM

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

当我查询products表中的各种内容时,我只希望得到供应商从“offers”表中销售产品的结果。现在我使用的查询如下:

SELECT *
FROM products
WHERE
products.sku IN (SELECT offers.sku FROM offers)
AND
products.name = 'Iphone'
AND
blah.....
对于有许多结果的查询,这可能需要更长的时间。有没有更有效的方法来查询这两个表?也许加入?谢谢。

存在,或者连接的性能可能比In更高,但这并不能保证优化器不会将以下内容视为与查询相同的内容

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

为sku和筛选条件中使用的其他字段编制索引可能是您所寻求的性能方面的一大进步。

将其转换为联接语法可能会获得与优化器通常相当智能的性能相同的性能。谓词上的数据类型和索引是什么?products.sku、products.name等products.sku是主键,因此它有自己的索引,并提供.sku也有自己的索引。由于我们的所有sku长度正好为12个字符,所以这两个sku上的数据类型都是CHAR12。您能否从查询中省略sku谓词以验证它是否确实是性能问题的原因?在测试查询中省略SELECT offers.sku from of offers查询中的products.sku需要大约0.5秒到0.3秒。SELECT products.*从products JOIN offers ON offers.sku=products.sku,其中products.name='Iphone'是连接语法,但我认为这无助于解决性能问题,但可能值得一试。@TimM是否将现有版本的性能与缓存结果进行比较?可能是您的瓶颈是其他筛选条件,但EXISTS的性能应该与中的相同或更好。我已关闭查询缓存,因此我假设任何地方都没有缓存任何内容。但使用exists使查询从大约.5秒变为大约2秒。这很奇怪,我希望exists和JOIN的性能相同,与中的性能相同或更好,但谁知道呢。我建议您在一个短时间运行的查询中创建一系列测试查询,以检查平均值,因为单个查询可能会根据环境中的其他情况而有所不同。非常感谢,是的,我还将进行更多的测试和双重检查索引。我只是希望有银弹可以大大加快速度。