当前位置: 首页 > 知识库问答 >
问题:

Laravel雄辩太慢与大量的数据

籍星汉
2023-03-14

我使用的是Laravel7.0和MySQL 5.7。

我使用Eloquent从数据库中获取记录,当数据库包含大量数据时,响应时间变得非常慢。

以下是几个例子:

Movie::where('title'、'LIKE'、'%'。$search.'%'))-

Movie::orderBy('等级','desc')-

Person::has('acted')-

当我使用约1000条记录的测试数据库时,响应时间是可以接受的,但当我切换到约500000条记录的实时数据库时,这太可怕了。

任何关于如何提高性能的建议都将不胜感激!


共有2个答案

裴昊阳
2023-03-14

喜欢'%...'是非常低效的。必须通过扫描文本检查每行。

更好的是使用

FULLTEXT INDEX(title)

WHERE MATCH(title) AGAINST('+$search')

(对不起,我不知道如何将其转换为Laravel。)

电影::orderBy('rating','desc')-

这可能是由

INDEX(rating)
翟昊明
2023-03-14

我认为任何人都不需要在一个页面中看到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服务器)获取数据。 有没有办法转换这个?也许在模型上?