MySql与PHP配合查询数据哪种方法更快?

背景: 大概10000条数据表中有个 ‘status’ 字段,状态为 0 或 1, 需要把表中的数据按status进行分类。

即:我需要得到这样一个数组(不要纠结于我的命名。。。):

[
    0 => [
        ['id' => 1, 'status' => 0, 'name' => 'zhangsan'],
        ['id' => 3, 'status' => 0, 'name' => 'zhangsan2'],
        ......此处省略n行
    ],
    1 => [
        ['id' => 1, 'status' => 1, 'name' => 'zhangsi'],
        ['id' => 3, 'status' => 1, 'name' => 'zhangsi2'],
        ......此处省略n行
    ],
]

方法一 : mysql 查询一次,利用php遍历分类成数组(不考虑使用php内置array函数)

$sql = 'select * from table';

$res = $model->findBySql($sql)->all();

$arr[0] = [];
$arr[1] = [];

foreach ($res as $var) {
    switch ($var->status) {
        case 0 :
           $arr[0][] = $var;
           break;
        case 1 :
           $arr[1][] = $var;
           break; 
    }
}

return $arr;

方法二 : mysql分别查询两次

$sql0 = 'select * from table where status=0';
$sql1 = 'select * from table where status=1';

$arr[0] = $model->findBySql($sql0)->all();
$arr[1] = $model->findBySql($sql1)->all();

return $arr;

这两种方式那个快?是绝对的吗?
若表中有十万条,一百万条数据呢?
若 status 有 10 种,100 种,1000种呢?

阅读 3.3k
3 个回答

若是只有2个值,那你这个问题就是select*from table.mysql的大忌。方案一的问题在于,数据数量不确定性,php处理可能会超时,因为服务器响应时间一定.数据到了百万就会犹如蜗牛爬树.2.若状态值还有其他的值,你可以在状态上建索引,这样一个mysql where and查出数据,然后再php处理,(ps:即使加了索引,我也不建议你一次性拿出所有数据,因为数据到了一定量级,php处理大数组也会很慢)这时候,你需要加些limt0,10

数据量小时,第一种。数据量大时第二种。具体分界线还是要靠测试。。另外这个一看就是yii框架不用自己写sql吧。
find()->where()->all()这样就好了

给status创建索引

大数据时, php处理绝对卡死你(内存占用大)

数据量很小时, php处理会快, 因为省下了一次查询时间(几ms)

最后, 不要一次跑大量的数据, 可以每次10000条的跑, 内存的伤会影响到整台服务器, 而且会是恶性循环

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题