繁体   English   中英

如何使用laravel加速Mysql查询

[英]How can I Speed up Mysql query using laravel

具有慢功能的Webapp。

我要求建议使用代码将此功能从5-6秒加速到1-2秒。

我有带有表的数据库:

表格:工作人员(编号,名字,姓氏)

表格:商店(编号,名称)

表格:worker_store(id,worker_id,store_id)

这个想法是通过worker_store表将worker连接到单个或多个商店。

在Laravel应用程序中,我有一个可以接收单个商店并显示工作人员已连接到该特定商店的功能。 必须将其显示为“选择”字段,并将已连接的工作程序标记为“已选择”,并将所有其他工作程序标记为未选择。 我的Laravel刀片代码如下所示

<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,工作表有30,000条记录。 当laravel向数据库发出30 000个单独的查询以检查每个工作人员是否链接到特定商店时,这非常慢(上面代码的粗体部分)。

请提出一种不需要查询3万次数据库并在不超过1-2秒的时间内完成填充的解决方案(当前代码大约需要5-6秒)。

要在视图中放很多东西,但这是我认为您正在寻找的基本概念...

// 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个查询。 1个要抓住所有工人,2个要按商店抓住工人。

看来您的模型设置不正确。 在您的Store模型中,添加功能...

public function workers()
{
    return $this->belongsToMany(Worker::class, 'worker_store');
}

我认为您应该重新考虑如何制作此应用程序。

选择中有30k个选项没有意义,谁会去检查select中的30k个选项以检入和检出选项? 谁会读那些选项?
这是没有意义的,是无法使用的应用程序。 以及为什么您要创建一个没人能使用的应用程序?

首先,您需要考虑问题,然后是如何解决问题,您的解决方案实际上将如何帮助某人解决问题,而不是引起更复杂的问题。 扔掉所有数据并不是解决任何问题的方法。

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

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

这样,用户可以以更合适和可行的方式搜索所需的选项,浏览内容,更改内容。

注意:此外,还要确保数据库中与其他数据相关的每一列,您订购的每一列以及用于过滤的每一列都具有索引。

您的问题不只是查询,而是您在HTML中抛出的海量数据

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM