ホームページ  >  記事  >  バックエンド開発  >  大量のデータテーブルを処理するための ThinkPHP のメカニズムの詳細なコードと説明_PHP チュートリアル

大量のデータテーブルを処理するための ThinkPHP のメカニズムの詳細なコードと説明_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 17:42:51995ブラウズ

ThinkPHP の組み込みテーブル分割アルゴリズムを適用して、数百万のユーザー データを処理します。

データシート:

house_member_0

house_member_1

house_member_2

house_member_3

モデル内

クラス MemberModel extends AdvModel {

protected $partition = array(field=>username,type=>id,num=>4);

パブリック関数 getDao($data=array()) {

$data = empty($data) ? $_POST : $data;

$table = $this->getPartitionTableName($data);

return $this->table($table);

}

}

方法

クラス MemberAction extends BaseAction {

パブリック関数login() {

if($this->isPost()) {

$this->validToken();

$dao = D(メンバー)->getDao();

$res = $dao->where(username = .$_POST[username])->find();

// 出力はカスタムメソッドです

// $isAjax - bool

$this->output(false);

}

$this->display();

}

}

/**

+------------------------------------------------ ----------

* サブテーブルのデータテーブル名を取得します

+------------------------------------------------ ----------

* @access public

+------------------------------------------------ ----------

* @param array $data 操作対象のデータ

+------------------------------------------------ ----------

* @return string

+------------------------------------------------ ----------

*/

public function getPartitionTableName($data=array()) {

// データテーブルを分割します

if(isset($data[$this->partition[field]])) {

$field = $data[$this->パーティション[フィールド]];

switch($this->partition[type]) {

ケースID:

// ID 範囲に従ってテーブルを分割します

$step = $this->partition[expr];

$seq = Floor($field / $step)+1;

休憩;

事件年:

// 年ごとに分けた表

if(!is_numeric($field)) {

$field = strtotime($field);

}

$seq = date(Y,$field)-$this->partition[expr]+1;

休憩;

ケースモッド:

// id の係数に従ってテーブルを分割します

$seq = ($field % $this->partition[num])+1;

休憩;

ケース md5:

// md5 シーケンスに従ってテーブルを分割します

$seq = (ord(substr(md5($field),0,1)) % $this->partition[num])+1;

休憩;

デフォルト:

if(function_exists($this->partition[type])) {

// 指定された関数ハッシュをサポート

$fun = $this->パーティション[タイプ];

$seq = (ord(substr($fun($field),0,1)) % $this->partition[num])+1;

}その他{

// フィールドの最初の文字の値に従ってテーブルを分割します

$seq = (ord($field{0}) % $this->partition[num])+1;

}

}

return $this->getTableName()._.$seq;

}その他{

// 設定したサブテーブルのフィールドがクエリ条件やデータにない場合

// 結合クエリを実行するには、partition[num] を設定する必要があります

$tableName = array();

for($i=0;$ipartition[num];$i++)

$tableName[] = SELECT * FROM .$this->getTableName()._.$i;

$tableName = ( .implode(" UNION ",$tableName).) AS .$this->name;

$tableNameを返す;

}

}

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/486019.html技術記事 ThinkPHP の組み込みテーブル分割アルゴリズムを使用して、数百万のユーザー データを処理します。 モデル クラス MemberModel のデータ テーブル: house_member_0 house_member_1 house_member_2 house_member_3 は、AdvMode を拡張します...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。