国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

超大數(shù)組update數(shù)據(jù)庫,采用什么方案比較好呢?

問題描述

mysql里面有個字段用于存放用戶的數(shù)據(jù),每個用戶都會增加一個json數(shù)組,例子:100個用戶,就有100個json數(shù)組,

[{"uid":1646,"nickName":"微信大sss號"},{"uid":1646,"nickName":"微信大sss號"},{"uid":1646,"nickName":"微信大sss號"},................]

方案1:每個用戶新增數(shù)據(jù)都是取之前的數(shù)據(jù),然后php往頭部插入,再轉(zhuǎn)json全部更新到mysql。
【弊端】實際測試我的業(yè)務(wù),當達到140多人時,text類型已經(jīng)存不下了,然后改成longtext,當達到500人時(500個json數(shù)組),更新速度越來越慢,I/O應(yīng)該很高(讀寫)。

方案2:采用concat_ws方案,每次在mysql前部插入新的json字符串,不用全部讀取和全部更新,只是往前插入一個json串,實際測試500人,更新速度快了一點點

 //本次用戶數(shù)組json中文不轉(zhuǎn)碼
$userInfoJsonStr = json_encode($userInfoJson, JSON_UNESCAPED_UNICODE);
//單獨用戶uid
$uid = $userData['id'];
//數(shù)據(jù)庫前綴
$prefix = Db::getConfig('prefix');
//更新語句
$updateSQL = "UPDATE {$prefix}_options
        SET num       = num - 1,
            user_num  = user_num + 1,
            user_data =
        CASE
            WHEN
                (user_data IS NULL OR user_data = '')
            THEN
                '[{$userInfoJsonStr}]'
            ELSE
                concat_ws(',','[{$userInfoJsonStr}',substring(user_data,2))
            END,
                uid_data =
        CASE
            WHEN
                (uid_data IS NULL OR uid_data = '')
            THEN
                {$uid}
            ELSE
                concat_ws(',',{$uid}, uid_data)
            END
        WHERE
            id = " . $edit_id;

為此你搜索到了哪些方案及不適用的原因

user_data存放超大json數(shù)組(只關(guān)注這個字段)
截圖
大家覺得方案2有問題嗎?能將磁盤I/O降到最???每次只更新一小段。
在不采取分表的情況下,大家還有更好的方案嗎?

1735 3 0
3個回答

PHP甩JAVA一條街

實際方案2跑起來也不快,更新1.3s,方案1是1.8s,咋回事呢?字段里面的數(shù)據(jù)很多的,500人,大概有500-800K

2548a

這是設(shè)計有問題,改數(shù)據(jù)結(jié)構(gòu),用另一張表記錄user_data 數(shù)據(jù),這張表只記錄uid集合就行,獲取數(shù)據(jù)就查uid集合然后whereIn把另一張表user_data數(shù)據(jù)找出來合并.

  • PHP甩JAVA一條街 2023-03-13

    業(yè)務(wù)能支撐,改起來太麻煩,只能在不大改的情況下,優(yōu)化現(xiàn)有的

小W

試試blob類型呢

年代過于久遠,無法發(fā)表回答
??