1

我有两张完全相同的表 - products 和 products_temp。我想比较这两个表,我目前正在使用下面的查询,如果每个表中没有很多产品,它可以正常工作,但是我现在每个表中有大约 10,000 个,它需要永远运行,然后因错误而死' mysql服务器已经消失了'。

请查看下面的查询并建议我如何优化它

SELECT MIN( id ) AS id , product_id, product_name, program_id, program_name, deeplink,   price, image_url, merchant_category, category_id, category_path, brand, last_updated, tab
            FROM (
                SELECT id , product_id, product_name, program_id, program_name, deeplink, price, image_url, merchant_category, category_id, category_path, brand, last_updated, 'Temp' AS                   tab
                FROM products_temp AS alias1
            UNION ALL 
                SELECT id , product_id, product_name, program_id, program_name, deeplink, price, image_url, merchant_category, category_id, category_path, brand, last_updated, 'Current'                   AS tab
                FROM products AS alias2
            )AS alias_table
            GROUP BY id
            HAVING COUNT( id ) =1 #
4

1 回答 1

0

您的查询显然总是从“Temp”或“Live”表中返回每个 ID,从而返回每一行。您实际上可能正在寻找的是......从“临时”表中的所有记录中,它们是否已经存在于“实时”表中,或者它们是新的并且需要更新/刷新。为了得到这个答案,我会做一个左连接,比如

SELECT tmp.*, if( products.id IS NULL, 1, 0 ) as NotOnLiveFile from products_temp tmp left join products on tmp.ID = products.id

不需要分组,也不需要 HAVING 子句。如果产品已经在文件中,你想用它做什么......用来自 Temp 的值更新实时值?如果记录是“NotOnLiveFile”,你想添加那些吗?使用这种方法,您可以在一个结果集中获得所需的一切。

如果这是您的意图,您可以随时进行相关更新(针对现有条目)或插入(如果尚未在实时文件中)。

于 2012-05-29T13:34:40.223 回答