Mysql

哪個更快?游標循環中的多個更新查詢,還是單個查詢?

  • April 8, 2018

哪個更快?游標循環中的多個更新查詢,還是單個查詢?例如,在這種情況下,哪個更快?此查詢在觸發器中。

  1. 循環中的多個查詢
DECLARE done INT DEFAULT FALSE;
DECLARE record_id INT;
DECLARE cur CURSOR FOR SELECT id FROM table1 WHERE column = 0;

OPEN cur;

 users_loop: LOOP

    FETCH cur INTO id;

    IF done THEN
        LEAVE users_loop;
    END IF;

    UPDATE table2 SET column = 0 WHERE id = id;

 END LOOP;

CLOSE cur;
  1. 單一查詢
CREATE TEMPORARY TABLE tmp_table (id int(10));

INSERT INTO tmp_table SELECT id FROM table1 WHERE column = 0;

UPDATE table2 SET column = 0 WHERE id IN(SELECT id FROM temp_table);

DROP TABLE IF EXISTS tmp_table;

這取決於很多因素:

  • 你的表定義
  • 您的索引定義
  • 你的事務隔離級別
  • 您的一般數據庫負載
  • 可用記憶體

如果您有足夠的記憶體、處理器能力和臨時表空間,那麼您的第二條語句應該是最快的,但缺點是同時發生大量鎖定。

InnoDB 中不同 SQL 語句設置的鎖

執行您的第一條語句可能會減少對所有其他使用者的鎖定,但這又取決於連接到數據庫的使用者的事務隔離級別。

事務隔離級別

如您所見,有許多因素會影響更新語句的執行。

如果沒有更多細節,我寧願使用第二個語句來提高速度,而您的第一個語句將在負載環境中使用。

這裡也問了一個類似的問題:

如何在不鎖定 MySQL 的情況下更新(非常)大的表

引用自:https://dba.stackexchange.com/questions/153869