【问题标题】:How to increase the speed MySQL query如何提高 MySQL 查询速度
【发布时间】: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 InventoryDESCRIBE Feeds 的结果跨度>
  • 至少对提要和库存表进行描述

标签: mysql performance


【解决方案1】:

MySQL 可以做到updates with join logic。假设您的 SKU 列至少被索引(唯一?),这应该表现得很好:

UPDATE Feeds AS f
JOIN Inventory AS i
    ON i.SKU = f.SKU
SET f.Quantity = i.Quantity

【讨论】:

    猜你喜欢
    • 2019-10-09
    • 2021-11-17
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2012-03-31
    • 2012-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多