1.目前有一张商品表,由于商品表数据超过250W 条,而且根据需求还会继续激增,所以考虑进行分表设计。
2.由于分表采用主键字段哈希分表,故需要将现有的250W 条数据进行hash处理分别插入到分出的10张表中,但是由于数据量太大,使用foreach来进行批量插入的时候每次都会超时。
3.哪位大神有使用Php处理大数据的经验,这种情况应该怎么处理。以下是我处理的代码:
for($i=0;$i<250;$i++){
$offset = $i*10000;
$where = array('where' => ' id>0',
'limit' => '10000',
'offset'=>$offset,
'fields'=>['goods_id','goods_name','goods_price']);
$res = $goodsModel->select($where );
foreach($res as $val){
//根据主键id进行hash获取表名
$tab_name = 'goods_'. getStringHash($val['goods_id']);
$data[$tab_name][] = $val;
}
foreach($data as $key=>$val){
$sql = "insert into {$key} ";
$sql_val_str = '';
foreach($val as $v){
$sql_key = array_keys($v);
$sql_val = array_values($v);
$sql_val_str .= '(';
foreach ($sql_val as $item) {
$sql_val_str .= "'".$item."'";
$sql_val_str .= ',';
}
$sql_val_str = substr($sql_val_str, 0, -1);
$sql_val_str .='),';
}
$sql_key_str = '('.implode(',',$sql_key).')';
$sql_val_str = substr($sql_val_str, 0, -1);
$sql .= $sql_key_str . 'values' . $sql_val_str;
$goodsModel->exec_sql($sql);
}
}
goods :id 商品码 商品编号 商品价格
1 H235KHAK 123456 123465
主要结构就是这样的,其中商品码是不允许重复的,而且是10位数字和字母结合的随意字符
分表后是根据商品码进行hash计算,获取hash值(0-9) 最后实现的结果是:goods_0,goods_1,goods_2....goods_9 将数据分布插入到这些表中
hash算法是在网上找的一个:
function getStringHash($string, $tab_count=10)
{/*{{{*/
$unsign = sprintf('%u', crc32($string));
if ($unsign > 2147483647) // sprintf u for 64 & 32 bit
{
$unsign -= 4294967296;
}
return abs($unsign) % $tab_count;
}
精慕HU
九州编程
拉莫斯之舞
猛跑小猪