ホームページ > php教程 > php手册 > 大量のデータのサブテーブルを処理するための ThinkPHP のメカニズムの詳細なコードと説明

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

WBOY
リリース: 2016-06-21 08:55:43
オリジナル
1462 人が閲覧しました

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 文字列

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

*/

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

// データテーブルをパーティション化します

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

$field = $data[$this->partition['field']];

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;

休憩;

ケース 'mod':

// 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->partition['type'];

$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 を返す;

}

}




関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート