您現在的位置是:首頁 > 棋牌

一個看似糾結的MySQL標籤需求的梳理

  • 由 楊建榮的資料庫筆記 發表于 棋牌
  • 2022-11-01
簡介2)從庫端不光進行資料過濾,還需要進行一些資料的統計分析,進行去重和過濾3)在經過需求確認後,把變更語句按照主鍵條件釋出到線上對於標籤的衝突關係梳理,我提出了改進的思路

表的索引怎麼重建

我們日常工作中總是會有一些看起來繁瑣,吃力不討好的事情,但是這些需求我們不能一概而論,為了落實規範而動用規範的大棒。

對我來說,我喜歡那種開放型的問題,比如看起來很繁瑣無解,但是業務又迫切需要的事情。

比如業務同學今天提了一個問題:有一張表,資料量有600多萬,而且資料實時的寫入還挺多,記錄的是一些工作的備註資訊,比如客服同學接受了一個使用者請求,然後會把這些資訊記錄下來,比如是關於哪個業務方向的,關於哪個遊戲的等等,都當做一個欄位資訊儲存起來。之前的管理是一種相對籠統的方式,在管理中會難以衡量和控制。 所以現在想使用類似標籤的方式進行資訊歸類。

舉個例子來說,客服同學之前處理了幾個需求,假設記錄的格式是這樣的:

使用者xxx諮詢遊戲A的登入問題。

使用者xxx反饋遊戲B的充值問題,反饋遊戲C(可能錯別字)的經驗沒有生效。

使用者xxx反饋手機號登入遊戲B(可能縮寫)失敗,而且充值有問題。。。

所以使用者反饋的資訊是沒有嚴格的格式和規範,要對這些使用者請求打上標籤難度還是比較大的。

對一張600多萬的大表進行業務整改,勢必會有一些全流程的改變,首先業務同學給我們出了個難題,這個表的索引是比較多的,重建的過程遠遠超出了我們的預期,還好使用了pt-osc工具還算穩。

現在表的一個標籤欄位已經建立好了,就需要進行下一步的工作:打標籤。

業務同學進行梳理和討論,整理了大概12個種類的關鍵字,每個關鍵字會對應一個數字編碼,也就是能夠被識別業務標籤。

array(

1 => ‘關鍵字1’,

2 => ‘關鍵字2’,

3 => ‘關鍵字3’,

4 => ‘關鍵字4’,

5 => ‘關鍵字5’,

6 => ‘關鍵字6’,

7 => ‘關鍵字7’,

8 => ‘關鍵字8’,

9 => ‘關鍵字9’,

10 => ‘關鍵字10’,

11 => ‘關鍵字11’,

12 => ‘關鍵字12’

);

面對這麼多的種類,難點來了,有些標籤是有互斥關係的,有些是可能存在關鍵字重合的,比如“膝上型電腦”“臺式電腦”這兩個詞是互斥的兩種型別,而“筆記本”和“膝上型電腦”又是互斥的。

如果讓業務部門去統計這麼多的重合標籤,估計會瘋掉,因為按照一個粗略的計算,比如6個標籤,4個重合的機率就是16+5+1=22種,如果是12類標籤,那方案複雜度要高得多,至少得上百種。

最關鍵的,哪怕這些都梳理出來,根據評估需要變更的資料有70萬,怎麼高效的把70萬資料都發布到線上,這是一個值得思考的問題。 整體的思路是:

1)線上的關鍵字模糊匹配工作要放到從庫來執行。

2)從庫端不光進行資料過濾,還需要進行一些資料的統計分析,進行去重和過濾

3)在經過需求確認後,把變更語句按照主鍵條件釋出到線上

一個看似糾結的MySQL標籤需求的梳理

對於標籤的衝突關係梳理,我提出了改進的思路。

既然有12類標籤,那麼我們完全可以按照12個數據子集進行單獨的關鍵字過濾,如果有一些標籤是重合的,那麼在12類標籤過濾中勢必會出現。

一個看似糾結的MySQL標籤需求的梳理

面對這種多對多的對映,我們可以完全統計出這些多標籤的比例來,如果佔比不到0。1%,那麼這些單據我們完全可以透過人工來判別,這樣一來,99%以上的資料都可以自動完成,人工只需要進行判斷很少的單據,避免我們的需求從開始就進入本末倒置的狀態。

所以我按照單號(order_id,tag_name,tag_id)來進行資料抽取,很快就得到了12個數據子集,我們假設為dataset1-dataset12

然後我們把這些自己的資料寫入一個共同的集合dataset中。

select order_id,count(*)from dataset group by order_id having count(*)>1就可以得到多標籤的單據了。

而經過初步的統計,這個資料量級確實是很低的,5個重合標籤的單據都是個位數,99%以上的單據都是單標籤。

所以這一層關係確定之後,我們就可以考慮進行線上的資料部署優化了,而這也正是DBA要做的專業的事情。

如果變更語句有30萬,那麼我們構造出30萬條SQL語句是成本比較高的。

我們可以把dataset的結果匯入線上環境中,建立索引(order_id,tag_id)

然後分批次變更,儘可能避免半連線操作,根據實踐的效果來看,每一步基本都控制在毫秒級完成。

Top