项目需求是这样的:例如:mysql数据库表中有一个字段为:body,其类型为:text,保存一些企业信息,这里假如有三种信息如下:公司概况#page#公司历史#page#公司行情
以上:三种信息我用分隔符(#page#)分开存入数据库字段(body),为的是方便存取。现在的问题是:目前数据库这种信息约有1000万条,前台网站会调用程序会读取这些信息,而且访问量很大,我的问题是我应当选择何种方式去存取这样的信息才能速度最快占用内存最少?现在有三种方案供我选择,请大家帮我参考一下:方案一:用#page分隔符号,把信息放入数据库,然后提取的时候用php的函数explode()分隔后再提取对应信息方案二:把信息存储为json格式放入数据库,提取的时候用json_decode()函数对其解析,然后提取对应信息方案三:把信息用serialize()函数序列化后存入数据库,提取的时候用unserialize()函数对其解析,然后提取对应信息
如果数据量少访问量也少的话可以不考虑这些问题,可以忽略,但是目前我这个项目的访问量和存储信息都非常的大,所以必须慎重选择一种好的存储和调用方法,能省多少内存省多少内存,能提高多少速度就提高多少,我想在大数据面前这三个函数还是有区别的,但自己经验太少,还请各位前辈分析解答,谢谢

解决方案 »

  1.   

    正好遇到这个项目帮你测试了一下,测试过程如下:
    三种形式事先存放各自序列化好的相同的数据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
      

  2.   

    从以上可以看出,explode速度最慢,但占用资源最低,最快的是:serialize
      

  3.   

    附上测试代码分享给大家:$txtId = 0;
    $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);
      

  4.   

    没有 memory_get_usage ???
    内存使用情况不能让人信服
      

  5.   

    天天在用,还真的没想过这问题,写了个脚本粗浅测试<?phpfunction prt($str) {
    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胜出
      

  6.   

    从测试结果看是序列化最合适,但考虑实际情况,硬盘空间相当相当廉价,为了兼容手机版网站使用json,或者干脆将概况历史行情3个文本拆成3个字段去存储也是可行的
      

  7.   


    http://blog.csdn.net/fdipzone/article/details/43679337