MySQL大量資料異動技巧
MySQL讀寫分離原理
Master / Slave
slave會從master抓 binlog 來做資料同步
binlog = binary log
binlog_format row statement mixed
https://www.cnblogs.com/zejin2008/p/5237902.html
cloudSQL只支援row
https://cloud.google.com/sql/docs/mysql/replication#bin-log-impact
在master是馬上完成,但在slave會是一筆一筆修改 (目前只有開單線程同步)
什麼是DDL DML
https://codertw.com/%E8%B3%87%E6%96%99%E5%BA%AB/10958/
重點1:
delete,update 可以加limit 1000,然後sleep(1),讓其他資料有機會同步,一直跑到 mysql affected rows 0為止。
重點2:
拆分表 一個月,一季 ,每星期 之類的 輪詢使用,透過呼叫的時間換算出要寫入的table,再直接用truncate 清掉(DDL)前一個週期的表,自然就不會走到要單筆同步的問題,有需要跨區間select可以走union。還有一個partition的功能可以使用,依照時間區間或是帳號的前幾碼來優化查詢範圍。
重點3:
對時間建立索引,但是透過增加date來建,不要直接對datetime建
另外如果常常是兩個條件一起看,要另外建複合索引,因為mysql一次select 只會用到一個索引。
再透過explain檢查,看到type是range,就表示成功了。
重點4:
下指令:show slave stauts, 然後查看 Seconds_Behind_Master ,確認一下是不是已經超過1分鐘,且一直追不上。
如果真的不幸踩到延遲,要看一下db大小,有可能重建會、比追完binlog還快。 ps.記得要先把db連線全部指master(write)