537レコードをロードするとパフォーマンスが低下する
ページ読み込み時:4.34秒
ページネーション:3.98秒
"pageLength": 10
datatableのページ付けを使用する場合よりも、クエリからページあたりの行数を10のように制限する可能性はありますか?組み込みのlaravelページ付けのように他の10をロードします
PS:ページ付けが無効になっていても、読み込み時間は4.34秒です
Controller
public function membresData()
{
$membres = Membre::
join('equipes', 'equipes.id', '=', 'membres.equipe_id')
->join('laboratoires', 'laboratoires.id', '=', 'equipes.laboratoire_id')
->join('etablissements as e1', 'e1.id', '=', 'laboratoires.etablissement_id')
->leftjoin('etablissements as e2', 'e2.id', '=', 'membres.etablissement_id')
->leftjoin('profils', 'profils.id', '=', 'membres.profil_id')
->leftjoin('typemembres', 'typemembres.id', '=', 'membres.typemembre_id')
->select ('membres.id','equipes.axe_recherche','laboratoires.libelle','laboratoires.periode_accreditation_dd','laboratoires.periode_accreditation_df','e1.abbreviation as etablab','membres.nom', 'membres.prenom', 'membres.cv', 'membres.sujet', 'e2.abbreviation as etabmem', 'profils.typeprofil', 'membres.cin', 'membres.email','typemembres.typemembre')
->orderBy('axe_recherche', 'asc')
->get();
if(request()->ajax()){
return Datatables::of($membres)
->addColumn('name',
'{{$nom}} {{$prenom}}'
)
->addColumn('cv', function ($membre) {
if ($membre->cv != null){
$url=url("uploadedCvMembre/$membre->etablab/$membre->cv");
return '<div data-provide="photoswipe">
<img class="avatar avatar-sm cursor-pointer" src="'.$url.'" alt="Curriculum vitae de : '.$membre->prenom.' '.$membre->nom.'" data-provide="tooltip" data-original-title="Curriculum vitae" data-tooltip-color="primary" aria-describedby="tooltip946475">
</div> ';
}
})
->addColumn('laboratoire',
'« {{$etablab}} » {{ $libelle }} <small>{{ \Carbon\Carbon::parse($periode_accreditation_dd)->format("Y") }} - {{ \Carbon\Carbon::parse($periode_accreditation_df)->format("Y") }}</small>'
)
->addColumn('action',
'<nav class="nav gap-1 fs-16">
<a class="nav-link disabled hover-warning" data-provide="tooltip" data-tooltip-color="warning" data-original-title="Modifier" href="{{route("membre.edit",$id)}}"><i class="ti-pencil"></i></a>
<form method="POST" action="{{ action("MembreController@destroy", ["id" => $id]) }}" class="delete_form">
<strong i="16">@csrf</strong>
@method("DELETE")
<a class="nav-link disabled hover-danger delete-btn" data-provide="tooltip" data-tooltip-color="danger" data-original-title="Supprimer" href="#"><i class="ti-trash"></i></a>
</form>
</nav>'
)
->rawColumns(['cv','laboratoire','action'])
->make(true);
}else{
abort('404');
}
Js
app.ready(function(){
$("#dtable").dataTable().fnDestroy();
$('#dtable').DataTable({
"columnDefs": [
{ "visible": false, "targets": [0,1] },
{ "orderable": false, "targets": [-1] }
],
"order": [[ 1, 'asc' ]],
processing: true,
serverSide: true,
ajax: '{!! route('membres') !!}',
deferRender: true,
columns: [
{ data: 'laboratoire', name: 'laboratoire' },
{ data: 'axe_recherche', name: 'axe_recherche' },
{ data: 'name', name: 'name' },
{ data: 'cv', name: 'cv', orderable: false, searchable: false },
{ data: 'sujet', name: 'sujet' },
{ data: 'etabmem', name: 'etabmem', orderable: false, searchable: false },
{ data: 'typeprofil', name: 'typeprofil' },
{ data: 'cin', name: 'cin' },
{ data: 'email', name: 'email' },
{ data: 'typemembre', name: 'typemembre' },
{ data: 'action', name: 'action', orderable: false, searchable: false}
],
"drawCallback": function ( settings ) {
$('[data-provide~="tooltip"]').each(function(){var b="";$(this).hasDataAttr("tooltip-color")&&(b=" tooltip-"+$(this).data("tooltip-color")),$(this).tooltip({container:"body",trigger:"hover",template:'<div class="tooltip'+b+'" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>'})});
var api = this.api();
var rows = api.rows( {page:'current'} ).nodes();
var last=null;
api.column(0, {page:'current'} ).data().each( function ( group, i ) {
if ( last !== group ) {
$(rows).eq( i ).before(
'<tr class="group bl-3 br-3 border-primary bg-light text-center" ><td class="fw-500" colspan="9">'+group+'</td></tr>'
);
last = group;
}
} );
api.column(1, {page:'current'} ).data().each( function ( group, i ) {
if ( last !== group ) {
$(rows).eq( i ).before(
'<tr class="group bl-3 border-warning bg-light" ><td class="fw-500" colspan="9">Equipe : '+group+'</td></tr>'
);
last = group;
}
} );
}
});
});
データソースのget()
を削除して、コレクションの代わりにクエリを使用します。
>orderBy('axe_recherche', 'asc')
->get(); // remove this line.
@yajra問題を解決していただきありがとうございます
こんにちは、クエリがコレクションよりもはるかに高速である理由を説明できますか?
すべての結果とそのサブデータを取得して効率の低い関数を実行しようとするのではなく、クエリで残りの関数を実行するためです。
応答時間が遅い
ページ読み込み:13.40秒
ページネーション:9秒
コードスニペット
パブリック関数lending_return_log_server_side()
{{
$ alluser = Session :: get( 'alluser');
$ reference = $ this-> database-> getReference( 'lending_return_log')-> getSnapshot()-> getValue();
$ reference = array_reverse($ reference);
$ data = [];
$ name = '';
$ email = '';
foreach($ reference as $ lending_return_log){
// dd($ lending_return_log ['uid']);
foreach($ alluser as $ key => $ value){
if($ key == $ lending_return_log ['uid']){
$ name = $ value ['username'];
$ email = $ value ['email'];
}
}
$ nestedData ['user_info'] = " "。 「」
「。$ email。」
"。$ lending_return_log ['lending_log_id'];
$ nestedData ['time_and_trx_id'] = \ Carbon \ Carbon :: parse($ lending_return_log ['time'])-> format( 'F j、Y、g:i a')。 "
"。$ lending_return_log ['trxid']。" ";
$ nestedData ['back_amount'] = " " .number_format($ lending_return_log ['amount_back_nob']、8)。 "NOB ";
$ nestedData ['closeing_balance'] = " " .number_format($ lending_return_log ['final_balance_nob']、8)。 "NOB ";
$ nestedData ['nob_price'] = $ lending_return_log ['nob_price_at']。 "$";
$ nestedData ['curr_return'] = " " .number_format($ lending_return_log ['return_of_cur']、8)。 ""。$ lending_return_log ['cur_type']。 " ";
$data[] = $nestedData;
}
// $reference = collect($reference);
$finalData = Datatables::of($data)->rawColumns(['user_info', 'time_and_trx_id', 'back_amount', 'closing_balance', 'nob_price', 'curr_return'])->make(true);
return $finalData;
}
(関数() {
$( '#table')。DataTable({
処理:true、
serverSide:true、
ajax: '{{url(' project-log-serverside ')}}'、
列:[
{データ: 'user_info'、名前: 'user_info'}、
{データ: 'time_and_trx_id'、名前: 'time_and_trx_id'}、
{データ: 'back_amount'、名前: 'back_amount'}、
{データ: 'closeing_balance'、名前: 'closeing_balance'}、
{データ: 'nob_price'、名前: 'nob_price'}、
{データ: 'curr_return'、名前: 'curr_return'}、
]
});
});
パッケージバージョン
Laravel 5.7
PHP:7.2
Laravel Datatable:8.13.7
データベース:NoSql DB(Firebase)
これの何が問題なのか教えていただけますか?
ありがとう
インデックスを確認してください
コントローラ:
$ trade1 = Tradecum3 :: where( 'CODE'、Auth :: user()-> ucc_code)-> where( 'SCPOPT'、 '!='、 'EX')-> select( 'UNIQUEID'、 'CODE' 、 'TRDATE'、 'BS'、 'SCPOPT as INSTTYPE'、 'SCPCODE'、 'SCPNAME'、 'DUEDATE'、 'STRIKERATE'、 'MKTRATE'、 'QTY'、DB :: raw( 'ABS(MKTRATE * QTY )as MKTTOTAL '));
$trade2 = Tradecum2::where('CODE', Auth::user()->ucc_code)->where('SCPOPT', '!=', 'EX')->select('UNIQUEID', 'CODE', 'TRDATE', 'BS', 'SCPOPT as INSTTYPE', 'SCPCODE', 'SCPNAME', 'DUEDATE', 'STRIKERATE', 'MKTRATE', 'QTY', DB::raw('ABS(MKTRATE * QTY) as MKTTOTAL'));
$trade = Tradecum1::where('CODE', Auth::user()->ucc_code)->where('SCPOPT', '=', 'EQ')->select('UNIQUEID', 'CODE', 'TRDATE', 'BS', 'SCPOPT as INSTTYPE', 'SCPCODE', 'SCPNAME', 'DUEDATE', 'STRIKERATE', 'MKTRATE', 'QTY', DB::raw('ABS(MKTRATE * QTY) as MKTTOTAL'))->union($trade1)->union($trade2);
return DataTables::of($trade)
->addColumn('INSTNAME', function ($trade) {
return $trade->SCPNAME."(". $trade->SCPCODE.")";
})
->editColumn('INSTTYPE',function($trade){
if($trade->INSTTYPE == "CE")
return "Call Opt";
else if ($trade->INSTTYPE == "PE")
return "Put Opt";
else if ($trade->INSTTYPE == "CF")
return "Futures(EQ)";
else if ($trade->INSTTYPE == "IF")
return "Futures(INDEX)";
else
return $trade->INSTTYPE;
})
->rawColumns(['INSTNAME'])
->make(true);
見る:
$( '#recentTradeTableAll')。DataTable({
処理:true、
serverSide:true、
破壊する:本当、
ajax:{
url: "{{route( 'datatable.trades')}}"、
タイプ: 'POST'、
ヘッダー:{
'X-CSRF-TOKEN':$( 'meta [name = "csrf-token"]')。attr( 'content')
}、
データ:function(d){
d.instrumentType = $("input[name='instrumentType']:checked").val();
d.transaction_type = $("input[name='transaction_type']:checked").val();
}
},
columns: [{
data: 'TRDATE',
name: 'TRDATE'
},
{
data: 'BS',
name: 'BS'
},
{
data: 'INSTNAME',
name: 'INSTNAME'
},
{
data: 'STRIKERATE',
name: 'STRIKERATE'
},
{
data: 'INSTTYPE',
name: 'INSTTYPE'
},
{
data: 'DUEDATE',
name: 'DUEDATE'
},
{
data: 'MKTRATE',
name: 'MKTRATE'
},
{
data: 'QTY',
name: 'QTY'
},
{
data: 'MKTTOTAL',
name: 'MKTTOTAL'
}
]
});
get()はすべてのデータをロードし、pageLengthは機能していません。上記はすべてのレコードをロードしています。
データソースの
get()
を削除して、コレクションの代わりにクエリを使用します。>orderBy('axe_recherche', 'asc') ->get(); // remove this line.
これにより、クエリが20秒から2秒未満になりました。ありがとうございます。
最も参考になるコメント
データソースの
get()
を削除して、コレクションの代わりにクエリを使用します。