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