项目需求是这样的:例如:mysql数据库表中有一个字段为:body,其类型为:text,保存一些企业信息,这里假如有三种信息如下:公司概况#page#公司历史#page#公司行情
以上:三种信息我用分隔符(#page#)分开存入数据库字段(body),为的是方便存取。现在的问题是:目前数据库这种信息约有1000万条,前台网站会调用程序会读取这些信息,而且访问量很大,我的问题是我应当选择何种方式去存取这样的信息才能速度最快占用内存最少?现在有三种方案供我选择,请大家帮我参考一下:方案一:用#page分隔符号,把信息放入数据库,然后提取的时候用php的函数explode()分隔后再提取对应信息方案二:把信息存储为json格式放入数据库,提取的时候用json_decode()函数对其解析,然后提取对应信息方案三:把信息用serialize()函数序列化后存入数据库,提取的时候用unserialize()函数对其解析,然后提取对应信息
如果数据量少访问量也少的话可以不考虑这些问题,可以忽略,但是目前我这个项目的访问量和存储信息都非常的大,所以必须慎重选择一种好的存储和调用方法,能省多少内存省多少内存,能提高多少速度就提高多少,我想在大数据面前这三个函数还是有区别的,但自己经验太少,还请各位前辈分析解答,谢谢
以上:三种信息我用分隔符(#page#)分开存入数据库字段(body),为的是方便存取。现在的问题是:目前数据库这种信息约有1000万条,前台网站会调用程序会读取这些信息,而且访问量很大,我的问题是我应当选择何种方式去存取这样的信息才能速度最快占用内存最少?现在有三种方案供我选择,请大家帮我参考一下:方案一:用#page分隔符号,把信息放入数据库,然后提取的时候用php的函数explode()分隔后再提取对应信息方案二:把信息存储为json格式放入数据库,提取的时候用json_decode()函数对其解析,然后提取对应信息方案三:把信息用serialize()函数序列化后存入数据库,提取的时候用unserialize()函数对其解析,然后提取对应信息
如果数据量少访问量也少的话可以不考虑这些问题,可以忽略,但是目前我这个项目的访问量和存储信息都非常的大,所以必须慎重选择一种好的存储和调用方法,能省多少内存省多少内存,能提高多少速度就提高多少,我想在大数据面前这三个函数还是有区别的,但自己经验太少,还请各位前辈分析解答,谢谢
三种形式事先存放各自序列化好的相同的数据10万个文本准备读取:
explode 大小:661Mb 占用空间:779Mb
serialize 大小:787Mb 占用空间:1.01Gb
json 大小:882Mb 占用空间:1.09Gb第一轮测试:
explode: 82.351449966431 秒
serialize:65.974032878876 秒
json :82.163902997971 秒第二轮测试:
explode: 101.51485490799 秒 内存使用:11200Kb
serialize:55.088683843613 秒 内存使用:11188Kb
json :52.850549936295 秒第三轮测试:
explode: 36.264735937119 秒 内存使用:11200Kb
serialize:36.270735025406 秒 内存使用:11196Kb
json :75.997661828995 秒 内存使用:11252Kb第四轮测试:
explode: 98.666929006577 秒 cpu:9% 内存使用:11196Kb
serialize:61.406966924667 秒 cpu:13% 内存使用:11192Kb
json :73.898298025131 秒 cpu:16% 内存使用:11248Kb
$startTime = microtime(true);
while(true)
{
$txtId++;
if($txtId>100000) break;
////////////////////////explode////////////////////////////////////////////////
// $dir = "D:/testFast/explode/{$txtId}";
// $str = file_get_contents($dir);
// foreach(explode('~!`',$str) as $val)
// {
// $val = explode('~@`',$val);
// foreach($val as $v)
// {
// //此处不输出
// }
// }
////////////////////////serialize////////////////////////////////////////////////
// $dir = "D:/testFast/serialize/{$txtId}";
// $str = file_get_contents($dir);
// foreach(unserialize($str) as $val)
// {
// foreach($val as $v)
// {
// //此处不输出
// }
// }
////////////////////////json////////////////////////////////////////////////
$dir = "D:/testFast/json/{$txtId}";
$str = file_get_contents($dir);
foreach(json_decode($str) as $val)
{
foreach($val as $v)
{
//此处不输出
}
}
echo $txtId ."\n";
}
echo "totalTime=".(microtime(true)-$startTime);
内存使用情况不能让人信服
echo $str . '<br />';
}function get_time() {
return time() + microtime();
}$ex = '#PAGE#';
$times = 1000;$body = array(
'content1' => '公司概况公司概况公司概况公司概况公司概况公司概况公司概况公司概况公司概况公司概况',
'content2' => '公司历史公司历史公司历史公司历史公司历史公司历史公司历史公司历史公司历史公司历史',
'content3' => '公司行情公司行情公司行情公司行情公司行情公司行情公司行情公司行情公司行情公司行情',
);$data = array(
array('name' => 'explode', 'encode' => function($arr){ return implode($ex, $arr); }, 'decode' => function($str){ return explode($ex, $str); }),
array('name' => 'json', 'encode' => function($arr){ return json_encode($arr); }, 'decode' => function($str){ return json_decode($str, true); }),
array('name' => 'serialize', 'encode' => function($arr){ return serialize($arr); }, 'decode' => function($str){ return unserialize($str); }),
);prt('字符串长度:');
foreach ($data as &$row) {
$row['content'] = $row['encode']($body);
$row['length'] = strlen($row['content']);
prt($row['name'] . ':' . $row['length']);
}
unset($row);prt('');
prt('编码' . $times .'次的时间:');
$start = get_time();
$a = array();
foreach ($data as &$row) {
for($i=0; $i<$times; $i++){
$a = $row['encode']($body);
}
$end = get_time();
prt($row['name'] . ':' . ($end - $start));
$start = $end;
}prt('');
prt('解码' . $times .'次的时间:');
$start = get_time();
$a = '';
foreach ($data as &$row) {
for($i=0; $i<$times; $i++){
$a = $row['decode']($row['content']);
}
$end = get_time();
prt($row['name'] . ':' . ($end - $start));
$start = $end;
}
字符串长度:
explode:360
json:763
serialize:438编码1000次的时间:
explode:1.0800619125366
json:0.017001152038574
serialize:0.015001058578491解码1000次的时间:
explode:2.461140871048
json:0.025001049041748
serialize:0.01400089263916serialize胜出
http://blog.csdn.net/fdipzone/article/details/43679337