【发布时间】:2014-11-07 18:46:44
【问题描述】:
我有一个 MySGL 查询:
UPDATE Feeds
SET Quantity = (SELECT Inventory.Quantity
FROM Inventory
WHERE Feeds.SKU = Inventory.SKU)
WHERE EXISTS (SELECT Inventory.Quantity
FROM Inventory
WHERE Feeds.SKU = Inventory.SKU);
它运行良好,但速度很慢。数据库是 MySQL inodb,行数在 50,000 左右,运行执行大约需要半小时。 如何减少执行时间?提前致谢。
【问题讨论】:
-
你在这些表上有什么样的索引?您在这里确实没有提供足够的信息。由于积极使用子查询,这看起来也非常缓慢。你确定不能作为更直接的多表
UPDATE来做到这一点吗? -
您在
Feeds.SKU和/或Inventory.SKU上有索引吗?UPDATE Feeds JOIN Inventory在这里会更好吗?试试:UPDATE Feeds JOIN Inventory USING(SKU) SET Feeds.Quantity = Inventory.Quantity;。JOIN应该处理WHERE EXISTS,因为它不会匹配没有匹配 SKU 的行。我没有对此进行测试,但我认为这是对的。 -
作为一般答案,请查看 EXPLAIN:sitepoint.com/using-explain-to-write-better-mysql-queriesdev.mysql.com/doc/refman/5.0/en/using-explain.html 如果不是太难,请尝试:sqlfiddle.com,否则发布
DESCRIBE Inventory和DESCRIBE Feeds的结果跨度> -
至少对提要和库存表进行描述
标签: mysql performance