第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

每 1 小時(shí)更新 MySQL 表中約 100 萬行

每 1 小時(shí)更新 MySQL 表中約 100 萬行

PHP
子衿沉夜 2023-08-19 09:38:57
我使用 Codeigniter 3.1.11 并有一個(gè)問題。我需要通過 Cron 每 1 小時(shí)更新 MySQL 表中大約 100 萬行(將來會(huì)更多)。但問題是,如果我使用此代碼更新超過約 200-300 行,我的服務(wù)器 CPU 已 100% 加載,并且表在約 200-300 行后停止更新。我什至必須重新啟動(dòng)服務(wù)器上的 PHP 才能使服務(wù)器恢復(fù)正常。我做錯(cuò)了什么?如何正確地完成這個(gè)任務(wù),使得對(duì)數(shù)據(jù)庫的查詢快速執(zhí)行并且不會(huì)給服務(wù)器帶來沉重的負(fù)載。這是來自控制器的代碼:function cron_rows_update() {$this->members_model->rows_update();} 
查看完整描述

2 回答

?
暮色呼如

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超9個(gè)贊

嘗試限制更新而不是一次性更新。分塊更新。


function cron_rows_update() {

? ?$num_of_members = $this->members_model->get_num_of_members();

? ?$limit_per_run = 150;

? ?$total_run = (int)$num_of_members/$per_run;

? ?

? ?for( $i = 0; $i <= $total_run; $i++ ) {

? ? ? $offset = $i * $limit_per_run;

? ? ? $this->members_model->rows_update($offset, $limit_per_run);

? ?}


}

并在rows_update()


function rows_update($offset, $limit_per_run) {

? ??

? ? **


? ? $this->db->limit($offset, $limit_per_run);

? ? $query = $this->db->get();

? ??

? ? $arrUpdateBatchData = [];

? ??

? ? while ($row = $query->unbuffered_row('array'))

? ? {

? ? ? ? // calculations and create array for batch update

? ? }


? ? // update in batch limiting to selected number of records

? ? if (count($arrUpdateBatchData) > 0)

? ? {

? ? ? ? $this->db->update_batch('members', $arrUpdateBatchData, 'UserID');

? ? }

}

您還可以嘗試使用控制器中的計(jì)時(shí)器功能在一定時(shí)間間隔后觸發(fā)更新并增加服務(wù)器容量,如評(píng)論中所述。


查看完整回答
反對(duì) 回復(fù) 2023-08-19
?
繁花如伊

TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個(gè)贊

除了您的代碼有點(diǎn)令人困惑($PER_part2并且$PER_part3未使用)這一事實(shí)之外,我還會(huì)執(zhí)行以下操作:

該腳本將無法運(yùn)行result_array超過 100 萬次迭代。原因是,result_array將所有數(shù)據(jù)存儲(chǔ)在數(shù)組中 - 遲早你會(huì)遇到內(nèi)存限制問題。

為了避免這種情況,你必須使用unbuffered_row.?此方法返回單個(gè)結(jié)果行,而不在內(nèi)存中預(yù)取整個(gè)結(jié)果。

接下來我要改變的是你的 if 塊 - 我將使用if/else這里的語法。(差別不是很大,但考慮到你的行數(shù) - 它可能會(huì)有所幫助)

另外,我外包了您使用相同邏輯兩次計(jì)算評(píng)級(jí)的塊。

基本上以下應(yīng)該有效:

function rows_update()?

{

? ? $currency_numbers_after_dot = $this->currencies_model->get_currency('ONE', 'My currencty')['numbers_after_dot'];

? ? $game_currency_percentage_max = $this->settings_model->get_settings_details('game_rating_percentage_max')['value'];

? ? $game_currency_speed_in_hour = $this->settings_model->get_settings_details('game_currency_speed_in_hour')['value'];

? ? $this->db->from('members');

? ? $query = $this->db->get();

? ??

? ? $arrUpdateBatchData = [];

? ??

? ? while ($row = $query->unbuffered_row('array'))

? ? {

? ? ? ? $game_total_balance = round($row['game_vault_balance'] + $row['game_available_balance'], $currency_numbers_after_dot);

? ? ? ? if ($game_total_balance > 0) {

? ? ? ? ? ? // Game Rating Calculate

? ? ? ? ? ? // Rating Part1

? ? ? ? ? ? // Rating Part1_1

? ? ? ? ? ? $rating_part1_1 = $this->getRatingPart($row['game_vault_balance']);

? ? ? ? ? ? $rating_part1_2 = $this->getRatingPart($game_total_balance);

? ? ? ? ? ? // Rating part1_3

? ? ? ? ? ? $rating_part1_3 = 0;

? ? ? ? ? ? // Rating part1_4

? ? ? ? ? ? $rating_part1_4 = 0;

? ? ? ? ? ? // Rating part2

? ? ? ? ? ? $PER_part2 = '0';

? ? ? ? ? ? // Rating part3

? ? ? ? ? ? $PER_part3 = '0';

? ? ? ? ? ? // Calculate all rating

? ? ? ? ? ? $rating = round($rating_part1_1 + $rating_part1_2 + $rating_part1_3 + $rating_part1_4 + $rating_part2 + $rating_part3, 2);

? ? ? ? ? ? if ($rating <= 1) {

? ? ? ? ? ? ? ? $rating_member = $rating;

? ? ? ? ? ? }

? ? ? ? ? ? elseif ($rating > 1) {

? ? ? ? ? ? ? ? $rating_member = floor($rating);

? ? ? ? ? ? }

? ? ? ? ? ??

? ? ? ? ? ? // Game balance calculate

? ? ? ? ? ? $amount_from_game_vault_in_hour = $game_currency_speed_in_hour / '100' * $row['game_vault_balance'];

? ? ? ? ? ? $new_balance_in_hour = ($game_currency_percentage_max / '100') * $row['rating'] * $amount_from_game_vault_in_hour;

? ? ? ? ? ? $game_balance_in_hour_amount = $amount_from_game_vault_in_hour + $new_balance_in_hour;

? ? ? ? ? ??

? ? ? ? ? ? $arrUpdateData = [

? ? ? ? ? ? ? ? 'UserID' => $row['UserID'],?

? ? ? ? ? ? ? ? 'game_vault_balance' => ($row['game_vault_balance'] - $amount_from_game_vault_in_hour),

? ? ? ? ? ? ? ? 'game_available_balance' => ($row['game_available_balance'] - $game_balance_in_hour_amount),

? ? ? ? ? ? ? ? 'rating' => $rating_member,

? ? ? ? ? ? ? ? 'game_rating_and_balance_update_last_time' => date('Y-m-d H:i:s')

? ? ? ? ? ? ];

? ? ? ? ? ??

? ? ? ? ? ? $arrUpdateBatchData[] = $arrUpdateData;

? ? ? ? ? ??

? ? ? ? }

? ? ? ??

? ? ? ? if (count($arrUpdateBatchData) > 500)

? ? ? ? {

? ? ? ? ? ? $this->db->update_batch('members', $arrUpdateBatchData, 'UserID');

? ? ? ? ? ? $arrUpdateBatchData = [];

? ? ? ? }? ? ? ?

? ? }

? ??

? ? //update last items

? ? if (count($arrUpdateBatchData) > 0)

? ? {

? ? ? ? $this->db->update_batch('members', $arrUpdateBatchData, 'UserID');

? ? ? ? $arrUpdateBatchData = [];

? ? }

? ? return;? ??

}


function getRatingPart($val)

{

? ? if ($val == 0) {

? ? ? ? $rating_part = 0;?

? ? }

? ? elseif ($val > 0 AND $val < 20)?

? ? {

? ? ? ? $rating_part = '0.1';?

? ? }

? ? elseif ($val > 20 AND $val < 2000)?

? ? {

? ??

? ? ? ? $max_game_vault_balance = 2000;

? ? ? ? $percent = floor($val * 100 / $max_game_vault_balance);

? ? ? ? $additional_rating = 0.05 * $percent / 100;

? ? ? ? ? ?

? ? ? ? $rating_part = round(0.1 + $additional_rating, 2);?


? ? }

? ? else {

? ? ? ? $rating_part = 0.15;?

? ? }

? ??

? ? return $rating_part;

}


查看完整回答
反對(duì) 回復(fù) 2023-08-19
  • 2 回答
  • 0 關(guān)注
  • 186 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)