首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用laravel加速Mysql查询

如何使用laravel加速Mysql查询
EN

Stack Overflow用户
提问于 2016-09-09 16:57:16
回答 2查看 1.5K关注 0票数 0

Webapp有一个功能是慢的。

我要求建议代码将这个函数的速度从5-6秒提高到1-2秒。

我有有表格的数据库:

表:工人(id,first_name,last_name)

表:商店(id,名称)

表: worker_store (id,worker_id,store_id)

这个想法是工人通过worker_store表连接到一个或多个商店。

在Laravel应用程序中,我有一个功能,它只使用一个商店,并显示员工与这个特定的商店相连接。这必须显示为“select”field,连接的工作人员标记为“selected”,所有其他工作人员都被显示为未选中。我的Laravel刀片代码看起来像这样

代码语言:javascript
复制
<select multiple name="workers[]" id="workers" class="form-control">
 @foreach (App\Worker::orderBy('last_name')->get() as $worker)                               
  <option value="{{$worker->id}}" 
  **@if ($object->hasWorker($worker->id))                                    
   selected @endif**>{{$worker->getName()}}
  </option>           
@endforeach  


</select>

数据库是MySQL,而worker表有30,000条记录。这是非常缓慢的,而laravel对数据库进行了30000个单独的查询,以检查每个工作人员是否链接到特定的商店(上面代码的粗体部分)。

请建议一个不需要查询30000次数据库并在不超过1-2秒内生成完整的解决方案(当前代码大约需要5-6秒)。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-09 17:52:06

这将是很多的意见,但这是基本的概念,我认为你正在寻找的.

代码语言:javascript
复制
// Grab all the workers so that we can loop through them.
$workers = App\Worker::all();

// Grab a list of the worker id's for the store we are currently searching for.
$storeWorkers = App\Store::with('workers')->find(1)->workers->lists('id');

// Use in_array to determine if the worker is currently working in the store we are looking at.
@foreach ($workers as $worker)
    <option value="{{ $worker->id }}" {{ in_array($worker->id, $storeWorkers) ? 'selected' : '' }}>{{ $worker->name }}</option>
@endforeach

这将为您提供总共3个查询。一抓工人,二抓工人。

似乎你的模型设置不正确。在您的Store模型中,添加以下函数..。

代码语言:javascript
复制
public function workers()
{
    return $this->belongsToMany(Worker::class, 'worker_store');
}
票数 0
EN

Stack Overflow用户

发布于 2016-09-10 22:08:22

我认为您应该考虑一下您是如何创建这个应用程序的。

在select中有30k选项是没有意义的,谁将通过select签入和退出选项的30k选项?谁会读这些选项呢?

它没有任何意义,是一个不可能使用的应用程序。你为什么要做一个没有人能使用的应用程序?

首先你需要考虑问题,然后是如何解决问题,你的解决方案将如何帮助别人解决问题,而不是造成更复杂的问题。抛出所有数据并不是任何事情的解决方案。

您可能应该想到AJAX/React/Vue.js或类似的前端功能,它允许用户以有意义的方式与数据进行交互。

但是,这需要时间,因此,您至少可以通过创建一个页面来快速解决这个问题,在该页面中,可以根据名称或其他内容筛选工作人员,然后使用分页,每个选项旁边都有一个复选框,指示是否选中并允许选择附加项,或者代替复选框--一个指示当前状态的颜色或图标--以及一个按钮来添加/删除它。

这样,用户就可以搜索它想要的选项,导航东西,以一种更合适和可行的方式改变事物。

注意:也要确保数据库中的索引在与其他数据相关的每一列中,在您订购的每一列,以及用于筛选的每一列中。

您的问题不在于查询,而在于您要在中添加大量的数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39416417

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档