我使用的是Laravel7.0和MySQL 5.7。
我使用Eloquent从数据库中获取记录,当数据库包含大量数据时,响应时间变得非常慢。
以下是几个例子:
Movie::where('title'、'LIKE'、'%'。$search.'%'))-
Movie::orderBy('等级','desc')-
Person::has('acted')-
当我使用约1000条记录的测试数据库时,响应时间是可以接受的,但当我切换到约500000条记录的实时数据库时,这太可怕了。
任何关于如何提高性能的建议都将不胜感激!
喜欢'%...'
是非常低效的。必须通过扫描文本检查每行。
更好的是使用
FULLTEXT INDEX(title)
和
WHERE MATCH(title) AGAINST('+$search')
(对不起,我不知道如何将其转换为Laravel。)
电影::orderBy('rating','desc')-
这可能是由
INDEX(rating)
我认为任何人都不需要在一个页面中看到500000个结果,您需要将其分成多个部分并对结果进行分页。您还可以使用chunk,或者使用cursor方法。选择一个最适合你需要的。
如果这是要由用户查看,那么我会建议分页的结果。这样用户可以转到下一页和下一页等。或者点击“加载更多”按钮向你的应用编程接口请求加载第2页和第3页等。
如果这只是为了处理数据以进行操作或更新值,我建议使用chunk或cursor。
分页:
Movie::where('title', 'LIKE', '%'.$search.'%')->paginate(20);
这将获取每页20项。
来源:https://laravel.com/docs/pagination#introduction
要分块:
Movie::where('title', 'LIKE', '%'.$search.'%')->chunk(200, function ($movies) {
foreach ($movies as $movie) {
//
}
});
这将一次获取200个,然后循环遍历它们。
资料来源:https://laravel.com/docs/eloquent#chunking-结果
要使用游标方法:
foreach (Movie::where('title', 'LIKE', '%'.$search.'%')->cursor() as $movie) {
//
}
这将使用游标遍历数据库记录,游标只执行一个查询。
资料来源:https://laravel.com/docs/eloquent#chunking-结果
Laracasts有一个10分钟的视频详细解释了它。
嘿,伙计们,我是拉威尔的新朋友。我有这张桌子 我如何能够获取每个科目的is_correct列计数? 谢谢伙计们!
我试着补充: 并用调用,但响应为空。
我有两张桌子。 产品品牌 我试图用最多的产品返回前十大品牌型号。 我试过了。 但是它不返回孔模型,只返回 品牌 计数 我也试过 但是我得到了错误: SQLSTATE[42S22]:未找到列:“where子句”中的1054未知列“brands.id”(SQL:选择count(*)作为从whereid=
我有以下雄辩的模型: 用户id 邮政编码 评论| id |发布| id |用户| id 使用eloquent,如何获取特定用户尚未发表评论的所有帖子? 到目前为止,我试过: 在模范岗位: 在模型注释中:
我是新来的拉威尔,我曾在codeigniter工作。我对雄辩的ORM概念着迷。我有一个关于雄辩能力的一般性问题。ORM的功能是什么,我的意思是我们可以获得相关表行的级别。如果你看“http://four.laravel.com/docs/eloquent#relationships 一对一 一对多 多对多 多态关系 在我看来,“一对一”意味着一级。表1表2
在有说服力的ORM上,是否有一种较短的方法在Laravel中插入数据? 目前我正在这样做: 就像你看到的,所有的列都像属性一样命名。 我知道您可以将对象与all()函数和fetch()一起使用。但是我从另一个对象(soap服务器)获取数据。 有没有办法转换这个?也许在模型上?