2021 01 19 mysql中,一張表裡有3億資料,未分表,其中乙個欄位是企業類 如何回答呢?

時間 2021-06-06 11:14:20

1樓:ccitt

樓上的同學回答的不錯,我再補充下。

假設表表是有自增id主鍵的話。可以先取出表中最大和最小的主鍵ID,然後用最小id開始,每次疊加5000-10000取個id主鍵範圍。並且符合「企業型別字段='個體戶'」條件的所有主鍵id。

2樓:乾貨滿滿張雜湊

假設表的引擎是 Innodb, MySQL 5.7+

如果不加 limit 則會由於需要更新大量資料,從而索引失效變成全掃瞄導致鎖表,同時由於修改大量的索引,產生大量的日誌,導致這個更新會有很長時間,鎖表鎖很長時間,期間這個表無法處理線上業務。

由於產生了大量 binlog 導致主從同步壓力變大由於產生了大量日誌,我們可以看到這張表的占用空間大大增高。

我們很容易想到,在 delete 後加上 limit 限制控制其數量,這個數量讓他會走索引,從而不會鎖整個表

alter table 你的表 engine=InnoDB, ALGORITHM=INPLACE, LOCK=NONE;

注意這句話其實就是重建你的表,雖然你的表的引擎已經是 innodb 了,加上後面的, ALGORITHM=INPLACE, LOCK=NONE 可以不用鎖表就重建表。

還有一種方案是,新建一張同樣結構的表,在原有表上加上觸發器

create trigger person_trigger_update AFTER UPDATE on 原有表 for each row

begin set @x = "trigger UPDATE";

Replace into 新錶 SELECT * from 原有表 where 新錶.id = 原有表.id;

END IF;

end;

這樣可以保證線上業務有新資料會同步。之後,將所有企業型別的資料,插入新錶,同時如果已存在則證明發生了更新同步就不插入。個體戶資料由於業務變化,並不在這個表上更新,所以這樣通過了無表鎖同步實現了大表的資料清理

每日一刷,輕鬆提公升技術,斬獲各種offer:

MySQL中使用LEFT JOIN遇到乙個問題,沒想通為什麼。請各位幫忙分析一下?

宋運奎 沒有結果的原因 T2的結果集 SELECT CREATE TIME,SUM BILL WEIGHT FROM BILL 的這個寫法是有問題的,MySQL低版本伺服器引數可以設定弱校驗,就是說語法校驗不是特別嚴格,即使這樣寫她也不會報錯 同樣的寫法Oracle就會報語法錯誤了 會隨機取乙個時間...

mysql負載一直100 以上,怎麼解決?

iseeyou 1.show processlist檢視當前頻繁執行哪些sql,這些sql是否可以優化 2.開啟慢查詢記錄,看這些慢查詢sql是否可以優化 3.檢視一些關鍵配置,看這些配置資訊是否有問題,針對cpu過高這種情況可以重點看如下三個配置項 使用查詢緩衝,MySQL將查詢結果存放在緩衝區中...

高中一定會厚積薄發嗎?

之博摩天 還是那句老話,付出不一定有收穫,但不付出一定不會有收穫。很多時候付出和回報是達不成正比的,甚至有時候付出了仍不見成效。但是付出可以使你擁有獲得收穫的機會。可以說是,付出使你的收穫有了可能。至於見成效的問題,跟付出方向與付出力度有關。你是否朝著正確的方向努力,你是否又足夠努力了呢?我想這才是...