insert select带来的问题
? ? 當使用 insert...select...進行記錄的插入時,如果select的表是innodb類型的,不論insert的表是什么類型的表,都會對select的表的紀錄進行鎖定。對于那些從oracle遷移過來的應用,需要特別的注意,因為oracle并不存在類似的問題,所以在oracle的應用中insert...select...操作非常的常見。例如:有時候會對比較多的紀錄進行統計分析,然后將統計的中間結果插入到另外一個表,這樣的操作因為進行的非常少,所以可能并沒有設置相應的索引。如果遷移到mysql數據庫后不進行相應的調整,那么在進行這個操作期間,對需要select的表實際上是進行的全表掃描導致的所有記錄的鎖定,將會對應用的其他操作造成非常嚴重的影響。
究其主要原因,是因為 mysql 在實現復制的機制時和 oracle 是不同的,如果不進行 select 表的鎖定,則可能造成從數據庫在恢復期間插入結果集的不同,造成主從數據的不一致。如果不采用主從復制,關閉 binlog 并不能避免對 select 紀錄的鎖定,某些文檔中提到可以通過設置innodb_locks_unsafe_for_binlog來避免這個現象,當這個參數設置為true的時候,將不會對select的結果集加鎖,但是這樣的設置將可能帶來非常嚴重的隱患。如果使用這個binlog進行從數據庫的恢復,或者進行主數據庫的災難恢復,都將可能和主數據庫的執行效果不同。
因此,推薦通過設置這個參數來避免 insert...select...導致的鎖,如果需要進行可能會掃描大量數據的 insert...select 操作,推薦使用select...into outfile 和 load data infile 的組合來實現,這樣是不會對紀錄進行鎖定的。
總結
以上是生活随笔為你收集整理的insert select带来的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 《EDIUS 6.5快刀手高效剪辑技法》
- 下一篇: 拼音b的拼读教案一等奖