Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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 在具有不同值的行上连接两个相同的表_Mysql_Sql_Join - Fatal编程技术网

Mysql 在具有不同值的行上连接两个相同的表

Mysql 在具有不同值的行上连接两个相同的表,mysql,sql,join,Mysql,Sql,Join,我有两个相同的表,一个是行的当前值,另一个是新值。我试图仅从“新值”表中选择行,其中“新值”表中的任何列的值与“旧值”表中的列的值不同。我现在使用的查询如下所示: SELECT `new`.`item_id` FROM `new_items` AS `new` JOIN `items` AS `old` WHERE new.item_id = old.item_id AND (new.price != old.price || new.descripti

我有两个相同的表,一个是行的当前值,另一个是新值。我试图仅从“新值”表中选择行,其中“新值”表中的任何列的值与“旧值”表中的列的值不同。我现在使用的查询如下所示:

SELECT `new`.`item_id` 
  FROM `new_items` AS `new` 
  JOIN `items`  AS `old` 
 WHERE new.item_id = old.item_id
   AND (new.price != old.price || 
        new.description != old.description || 
        new.description_long != old.description_long || 
        new.image_small != old.image_small || 
        new.image_large != old.image_large || 
        new.image_logo1 != old.image_logo1 )

但是,此查询的执行时间太长。MySQL是否有更好的方法来实现这一点,或者是否有人知道更高效的查询?

如果item\u id sku非常唯一,并且表中没有太多重复的item\u id,那么您只需在item\u id上添加一个索引就可以看到很大的性能改进。

如果item\u id sku非常唯一,并且表中没有太多重复的item\u id,然后,只需在item_id上添加一个索引,您就会看到巨大的性能改进。

使用:

SELECT n.item_id
  FROM NEW_ITEMS n
 WHERE EXISTS (SELECT NULL
                 FROM OLD_ITEMS o
                WHERE o.item_id = n.item_id
                  AND (o.price <> n.price
                   OR o.description <> n.description 
                   OR o.description_long <> n.description_long 
                   OR o.image_small <> n.image_small 
                   OR o.image_large <> n.image_large 
                   OR o.image_logo1 <> n.image_logo1))
为所有要比较的列编制索引。

使用:

SELECT n.item_id
  FROM NEW_ITEMS n
 WHERE EXISTS (SELECT NULL
                 FROM OLD_ITEMS o
                WHERE o.item_id = n.item_id
                  AND (o.price <> n.price
                   OR o.description <> n.description 
                   OR o.description_long <> n.description_long 
                   OR o.image_small <> n.image_small 
                   OR o.image_large <> n.image_large 
                   OR o.image_logo1 <> n.image_logo1))


为要比较的所有列编制索引。

如果您的数据对于此类操作来说太大,请使用查询使用过程。但是你必须用油,每张桌子有多少行?索引定义是什么?每个表大约12000行没有索引,我应该为每个字段添加索引吗?您应该在项目id上有一个索引。如果image\u large确实是一个大图像,难怪查询速度慢。考虑存储任何大字段的散列以进行比较。不要在其他字段上添加索引。如果您在item_id上没有索引,则此查询将在两个表上执行完整的表扫描,以匹配行。尝试在项_id上添加索引。如果它是SKU,则它应该是唯一的。如果您的数据太大,无法执行此类操作,请使用查询使用过程。但是你必须用油,每张桌子有多少行?索引定义是什么?每个表大约12000行没有索引,我应该为每个字段添加索引吗?您应该在项目id上有一个索引。如果image\u large确实是一个大图像,难怪查询速度慢。考虑存储任何大字段的散列以进行比较。不要在其他字段上添加索引。如果您在item_id上没有索引,则此查询将在两个表上执行完整的表扫描,以匹配行。尝试在item_id上添加索引。如果它是SKU,它应该是唯一的。嗯,我想测试一下它是否比我的快,但我一直收到一个sql错误“您的sql语法有错误;检查与MySQL服务器版本相对应的手册,以了解第10行附近使用的正确语法。错误在,但我不知道这有什么问题query@Chris:现在试一试-它缺少一个与我的速度相同的支架,但这也有效。这样做有什么好处?@Chris:如果有多条旧记录不匹配,则不会产生重复记录-很可能向查询中添加DISTINCT/GROUP BY会影响性能。你也没有提到你是否添加了索引。嗯,我本想测试一下它是否比我的快,但我一直收到一个sql错误“你的sql语法有错误;检查与MySQL服务器版本相对应的手册,以了解第10行附近使用的正确语法。错误在,但我不知道这有什么问题query@Chris:现在试一试-它缺少一个与我的速度相同的支架,但这也有效。这样做有什么好处?@Chris:如果有多条旧记录不匹配,则不会产生重复记录-很可能向查询中添加DISTINCT/GROUP BY会影响性能。您还没有提到是否添加了索引。