可以在鎖表後,一起執行幾個語句來加速 INSERT 操作:
LOCK TABLES a WRITE;
INSERT INTO a VALUES (1,23),(2,34),(4,33);
INSERT INTO a VALUES (8,26),(6,29);
UNLOCK TABLES;
這對性能提高的好處在於:直到所有的 INSERT 語句都完成之後,索引緩存一次性刷新到磁盤中。通常情況是,多有少次 INSERT 語句就會有多數次索引緩存刷新到磁盤中的開銷。如果能在一個語句中一次性插入多個值的話,顯示的鎖表操作也就沒必要了。對事務表而言,用 BEGIN/COMMIT 代替 LOCK TABLES 來提高速度。鎖表也回降低多次連接測試的總時間,盡管每個獨立連接為了等待鎖的最大等待時間也會增加。例如:
Connection 1 does 1000 inserts
Connections 2, 3, and 4 do 1 insert
Connection 5 does 1000 inserts
如果沒有鎖表,則連接2,3,4會在1,5之前就做完了。如果鎖表了,則連接2,3,4可能在1,5之後才能完成,但是總時間可能只需要40%。MySQL的 INSERT, UPDATE, DELETE 操作都非常快,不過在一個語句中如果有超過5個插入或者更新時最好加鎖以得到更好的性能。如果要一次性做很多個插入,最好是在每個循環(大約1000次)的前後加上 LOCK TABLES 和 UNLOCK TABLES,從而讓其他進程也能訪問數據表;這麼做性能依然不錯。INSERT 總是比 LOAD DATA INFILE 插入數據來得慢,因為二者的實現策略有著分明的不同。
想要讓 MyISAM 表更快,在 LOAD DATA
INFILE 和 INSERT 時都可以增加系統變量 key_buffer_size 的值,詳情請看"7.5.2 Tuning Server Parameters"。
7.2.13 加速 UPDATE
UPDATE 語句的優化和 SELECT 一樣,只不過它多了額外的寫入開銷。寫入的開銷取決於要更新的記錄數以及索引數。如果索引沒有發生變化,則就無需更新。