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