#jquery #ajax #performance #datatable #datatables
#jquery #ajax #Производительность #datatable #таблицы данных
Вопрос:
Используемый скрипт плагина:
<script src="https://cdn.datatables.net/1.10.20/css/jquery.dataTables.min.css"></script>
<script src="https://cdn.datatables.net/1.10.19/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.10.19/js/dataTables.bootstrap4.min.js"></script>
У меня есть datatable с максимальной строкой записей 19K. Я не использую обработку на стороне сервера или AJAX, это просто DOM. Я попытался перейти на обработку на стороне сервера, но повторная реализация всех функций занимает очень много времени. все дело в ресурсах изображения, которые были использованы для каждой записи, согласно моему предположению, что делает обработку данных самой медленной. Хотя на локальном он работает идеально. Различия между локальным и серверным представлены ниже.
Способ реализации таблицы, блок кода приведен ниже.
var tableone= $('#tableX').DataTable({
"scroller": true,
"deferRender": true,
"responsive": true,
"order": [[1, 'asc']],
"paging": true,
"pageLength": 150,
"bFilter": false,
"searching": true,
"rowCallback": function( row, data, index ) {
if ( data[9] == "MATCH COLUMN" )
{
$('td', row).css('background-color', '#b5b5de');
}
else if ( data[9] != "MATCH COLUMN" )
{
$('td', row).css('background-color', 'white');
}
},
"drawCallback": function ( settings ) {
var api = this.api();
var rows = api.rows( {page:'current'} ).nodes();
var last=null;
api.column(1, {page:'current'} ).data().each( function ( group, i ) {
if ( last !== group ) {
$(rows).eq( i ).before(
'<tr class="group"><td class="delBack"colspan="14">' '<strong> THIS SHOULD BE GROUPIFIED : ' group '</strong></td></tr>'
);
last = group;
}
} );
},
"autoWidth": false,
"aoColumnDefs": [{ "bSortable": false, "bSearchable": false, "aTargets": [2,4,5,6,7,8,9,10,11,12,13 ] } ],
"aoColumns": [{ "sWidth": "5%" }, { "sWidth": "5%" },{ "sWidth": "2%" }, { "sWidth": "3%" },{ "sWidth": "2%" },{ "sWidth": "19%" },{ "sWidth": "10%" },{ "sWidth": "3%" },{ "sWidth": "3%" },{ "sWidth": "3%" },{ "sWidth": "15%" },{ "sWidth": "5%" },{ "sWidth": "15%" },{"sWidth":"15%"}]
});
Я знаю о DOM, ИСТОЧНИКЕ AJAX и SSP. Но это должно быть сделано через клиентскую часть, а не сервер. Что можно сделать для повышения производительности с помощью эффективного способа извлечения изображений или ресурсов, если это является причиной чрезмерной нагрузки. Приветствуется любое предложение.
РЕДАКТИРОВАТЬ — ЗАГРУЗКА ИЗОБРАЖЕНИЯ
Изображение будет загружено в виде строки на основе базы данных, файлы будут загружены в папку. Когда изображения извлекаются в datatable, это делается следующим образом
$upload_dir = 'uploads/';
<tbody>
<?php
$sql = "SELECT * FROM `product` WHERE `status`= 'New'";
$result = mysqli_query($conn, $sql);
if(mysqli_num_rows($result)){
while($row = mysqli_fetch_assoc($result)) {
<td><img src ="<?php echo $upload_dir.$image ?>" height="30" width="30" data-toggle="modal" data-target="#imagemodal<?php echo $row['id']?>"></td>
<?php
}
?>
Затем при нажатии на миниатюру изображения полное изображение будет показано в модальном виде.
РЕДАКТИРОВАТЬ — ПОСЛЕ УДАЛЕНИЯ ИЗОБРАЖЕНИЯ
После удаления ресурсов изображения это неплохо. но для 19 тысяч записей все еще 10 секунд. не слишком ли это много?
Комментарии:
1. Извините, но 45 тысяч строк данных с сервера будут стоить дорого вообще и в DOM тоже. Вы должны подумать о разбивке на страницы
2. У нас 45 тысяч таблиц без разбивки на страницы, и это не очень медленно (это не очень хорошая идея, но они не очень-то медленные). Я думаю, что проблема здесь:
retrieve images
. Можете ли вы немного подробнее объяснить, как вы отправляете изображения из базы данных в datatable и как и где вы их отображаете?3. @IrvinDominin да, разбивка на страницы реализована со 150 записями на каждой странице. вы можете увидеть это здесь: подкачка»: true, «Длина страницы»: 150,
4. @Dani вероятно, я тоже думаю о том же. в локальном режиме загрузка занимает всего 2-6 секунд, в реальном — 32 минуты. да? Изображения, которые я загружаю для каждой записи, сохраняются в папке. получение-это просто называя имя изображения в камере, как <td><?php echo $row[‘image’]></td> с высоты свести к минимуму, а ширина.
5. Что такое
$row['image']
, URL или базовое изображение 64? Что произойдет, если вы измените его с помощью<td> </td>
???
Ответ №1:
Единственным решением, которое помогло мне, был переход на серверную часть с надлежащими реализациями, и разбивка на страницы была обязательной, чтобы сделать это еще быстрее. Я переработал все приложение, и запросы обрабатывались с помощью AJAX, что значительно уменьшило загрузку страницы. это с фактическим размером изображения. Спасибо всем, кто пытался это исправить.