MySql与PHP配合查询数据哪种方法更快?
天蓬老师
天蓬老师 2017-04-10 18:09:41
[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)
大家讲道理

若是只有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条的跑, 内存的伤会影响到整台服务器, 而且会是恶性循环

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号