MySQL大量資料異動技巧

Yotlin
Parenting 數位研發
Jun 13, 2022

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)

--

--

Yotlin
Parenting 數位研發

22年以上 Web 全端工程師經驗,目前任職於親子天下數位研發中心技術部,帶領團隊共同成長