加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

yii2框架sql查询one方和和findone方法,查询结果是多条

(2024-07-10 10:43:41)
分类: YII2
yii2框架 sql查询 one方和和findone方法,若不加limit ,查询结果是多条

亲测确认过,当条件不是id=*这种能唯一的情况,one和findone查询出来确实是多条。导致了慢查询。
加上limit(1)  就解决了。


使用yii2框架的ActiveRecord::find()->one()方法,出现Allowed memory exhausted错误


简介
在使用yii2框架的活动记录的find()->one()方法时,系统报Allowed memory exhausted错误,也就是内存枯竭错误。当时想,框架的one()方法,只取一条数据,怎么会把内存占用满了?所幸经过各种尝试,解决了这个问题。

场景:
1.数据库:Mysql 
2.有一个数据库表Demo,数据表结构:

id name age
1 demo 10
3.数据量大约有1500万 
4.对应数据表有一个ActiveRecord的Model,Demo 
5.满足查询条件的数据量大约有19万

代码
//查询代码如下,满足条件的数据有19万

Demo::find()->where(['name' => 'demo'])->one();

//执行后会出现内存耗尽的错误(Allowed memory exhausted)
1
2
3
4
5
解决方案
在查询sql中增加 limit(1) 限制

//因为one()方法是使用PDOStatement::execute()方法获取结果集,
//PDOStatement::fetch()方法获取一条记录,在execute执行后,数据已经返回到服务器,
//如果满足结果的数据量过大,就会把服务器的内存耗尽,造成致命性错误。
//所以只能在sql中加上limit 1来保证数据库返回的结果是一条。

Demo::find()->where(['name' => 'demo'])->limit(1)->one();

对于这个问题,yii2框架的开发社区有过多次讨论, 最近的一次讨论可以参考yiisoft/yii2的issues:
https://github.com/yiisoft/yii2/issues/13875
这个问题多次被提及,又多次被否决,也不知道咋回事,希望能够尽快给出合适的方案吧。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有