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会影响性能。您还没有提到是否添加了索引。