[英]Convert multiple NOT IN to LEFT JOIN to improve performance
我有此SQL查询,需要很长时间才能执行。
SELECT DISTINCT p.products_id,
p.products_group,
p.products_quantity,
p.products_length,
p.products_price,
p.products_height,
p.products_width,
p.products_weight,
p.products_cost,
p.products_rmb_cost,
p.products_best_rmb,
p.products_status,
p.products_image,
p.products_vendor_code,
p.products_date_added,
pd.products_name
FROM products p,
products_description pd
WHERE p.products_id = pd.products_id
AND p.products_id NOT IN(SELECT related_products_id
FROM products_related
WHERE products_id = '93667')
AND p.products_id NOT IN(SELECT products_id
FROM products_related
WHERE related_products_id = '93667')
AND p.products_group = '300'
AND language_id = 1
AND ( ( ( pd.products_name LIKE '%emerald%' )
OR p.products_image LIKE '%emerald%'
OR p.products_id LIKE '%emerald%' )
AND ( ( pd.products_name LIKE '%square%' )
OR p.products_image LIKE '%square%'
OR p.products_id LIKE '%square%' ) )
AND pd.products_id != '93667'
ORDER BY p.products_group,
p.products_quantity,
p.products_id
我试图将2个NOT IN零件转换为LEFT JOIN,以提高性能,但是尽管性能确实得到了显着改善,但我得到的结果与原始查询并不相同。 关于如何正确修改此查询以使用LEFT JOIN代替NOT IN的任何建议?
编辑:
这是我尝试过的,但是得到错误的结果:
SELECT DISTINCT p.products_id,
p.products_group,
p.products_quantity,
p.products_length,
p.products_price,
p.products_height,
p.products_width,
p.products_weight,
p.products_cost,
p.products_rmb_cost,
p.products_best_rmb,
p.products_status,
p.products_image,
p.products_vendor_code,
p.products_date_added,
pd.products_name
FROM products p,
products_description pd
LEFT JOIN products_related pr
ON pr.products_id = '93667'
AND pr.related_products_id = '93667'
WHERE p.products_id = pd.products_id
AND pr.products_id IS NULL
AND pr.related_products_id IS NULL
AND p.products_group = '300'
AND language_id = 1
AND ( ( ( pd.products_name LIKE '%emerald%' )
OR p.products_image LIKE '%emerald%'
OR p.products_id LIKE '%emerald%' )
AND ( ( pd.products_name LIKE '%square%' )
OR p.products_image LIKE '%square%'
OR p.products_id LIKE '%square%' ) )
AND pd.products_id != '93667'
ORDER BY p.products_group,
p.products_quantity,
p.products_id
尝试在下面将转换后的查询左移
SELECT DISTINCT p.products_id,
p.products_group,
p.products_quantity,
p.products_length,
p.products_price,
p.products_height,
p.products_width,
p.products_weight,
p.products_cost,
p.products_rmb_cost,
p.products_best_rmb,
p.products_status,
p.products_image,
p.products_vendor_code,
p.products_date_added,
pd.products_name
FROM products p
JOIN products_description pd ON p.products_id = pd.products_id
LEFT JOIN products_related pr1 ON p.products_id=pr1.related_products_id AND pr1.products_id = '93667'
LEFT JOIN products_related pr2 ON p.products_id=pr2.products_id AND pr2.related_products_id = '93667'
WHERE p.products_group = '300'
AND language_id = 1
AND ( ( ( pd.products_name LIKE '%emerald%' )
OR p.products_image LIKE '%emerald%'
OR p.products_id LIKE '%emerald%' )
AND ( ( pd.products_name LIKE '%square%' )
OR p.products_image LIKE '%square%'
OR p.products_id LIKE '%square%' ) )
AND pd.products_id != '93667'
AND pr1.related_products_id IS NULL
AND pr2.products_id IS NULL
ORDER BY p.products_group,
p.products_quantity,
p.products_id
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.