为了账号安全,请及时绑定邮箱和手机立即绑定

从mysql查出200万数据有什么好的办法

从mysql查出200万数据有什么好的办法

PHP
鸿蒙传说 2019-03-16 03:15:25
查询的时候老是崩溃
查看完整描述

12 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

不要用分页,查到后面越查越慢。
因为

limit 10000,100

这种那个10000是会查询然后丢弃的。
正确的做法是用游标。
假设你的游标字段为id

$cursor = 0;
$size = 1000;
do {
$sql = 'SELECT * FROM user WHERE id > :id ORDER BY id DESC limit :size';
$data = 执行查询得到的数组。
$count = count($data);
foreach($data as $row){
    $id = $row['id'];
//处理数据
}
// 当前条数不大于size,证明下面没数据了。
if($count<$size){
    break;
}
}while(true);

这种是利用mysql查询筛选【一部分你要的数据,不存在数据丢弃】。所以速度一直都很快

查看完整回答
反对 回复 2019-03-18
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

没有碰到这种问题都是一律的解决方案: 分页,limit。 一看就是没撞到过墙。

用pdo链接上数据库之后,设置这个参数,非常隐晦的一个参数,一般人不知道
$PDOObject->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);

然后上亿的数据行也是随便取,每条的返回速度都一致。

查看完整回答
反对 回复 2019-03-18
?
偶然的你

TA贡献1841条经验 获得超3个赞

你是想查出来计算呢,还是查出来展示呢,这么多数据要分块查询的。

查看完整回答
反对 回复 2019-03-18
?
慕沐林林

TA贡献2016条经验 获得超9个赞

楼上说的都不准确,你要是分页查,查到后面,能让你抓狂,你信不信,每次查询都要好久
有一个好的办法

select id from A where XXXXXXX limit xxx offset xxx;
select * from A where id in (上一步查询id);

这样会比较好些,速度基本不会有问题, 可以试一下这种办法

查看完整回答
反对 回复 2019-03-18
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

分页啊,直接查200万数据放内存肯定崩溃。

查看完整回答
反对 回复 2019-03-18
?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

分页 分块查询数据比较好,一次性查200w的数据,内存吃不消。

查看完整回答
反对 回复 2019-03-18
?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

肯定要分页啊,不然得多大的内存才吃得消

查看完整回答
反对 回复 2019-03-18
?
杨__羊羊

TA贡献1943条经验 获得超7个赞

循环分页查询 操作完以后记得unset掉结果集 不然长期占用大量内存会有很大问题.

查看完整回答
反对 回复 2019-03-18
?
MYYA

TA贡献1868条经验 获得超4个赞

SELECT Title FROM Information INNER JOIN (

SELECT ID FROM Information where IsDeleted =0 ORDER BY `CreateTime` LIMIT 1000,20

) AS x USING(`id`);


SELECT Title FROM Information where IsDeleted =0 ORDER BY `CreateTime` LIMIT 1000,20

上面的写法比下面快 30%

查看完整回答
反对 回复 2019-03-18
?
慕慕森

TA贡献1856条经验 获得超17个赞

可以用yeid每次查一百条数据

查看完整回答
反对 回复 2019-03-18
  • 12 回答
  • 0 关注
  • 1451 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信