Ускорьте загрузку таблиц с более чем 10.000 данными

Я новичок в таблицах данных, и я делаю данные поиска на веб-сайте, используя таблицы данных. Но данных mysql больше 10 000. Когда я пытаюсь искать данные в своей сети, таблицы данных очень долго отображают данные. Может ли кто-нибудь помочь мне, как мне получить таблицы данных для более быстрого отображения таблиц с большими данными. Спасибо

PHP:

    <?php
//fetch.php
$connect = mysqli_connect("localhost", "root", "", "test");
$columns = array('id', 'datetime', 'temperature', 'humidity');


$query = "SELECT id, datetime, temperature, humidity FROM data WHERE ";

if($_POST["is_date_search"] == "yes")
{
 $query .= 'DATE(datetime) BETWEEN "'.$_POST["start_date"].'" AND  "'.$_POST["end_date"].'" AND ';
}

if(isset($_POST["search"]["value"]))
{
 $query .= '
  (id LIKE "%'.$_POST["search"]["value"].'%")
 ';
}

if(isset($_POST["order"]))
{
 $query .= "GROUP BY DATE_FORMAT(datetime, '%d-%M-%Y-%H:%i:%s') ORDER BY 'id'";
}




$number_filter_row = mysqli_num_rows(mysqli_query($connect, $query));

$result = mysqli_query($connect, $query );

$data = array();

while($row = mysqli_fetch_array($result))
{
 $sub_array = array();
 $sub_array[] = ""; 
 $sub_array[] = $row["datetime"];
 $sub_array[] = $row["temperature"];
 $sub_array[] = $row["humidity"];
 $data[] = $sub_array;
}

function get_all_data($connect)
{
 $query = "SELECT * FROM data";
 $result = mysqli_query($connect, $query);
 return mysqli_num_rows($result);
}

$output = array(
 "draw"    => intval($_POST["draw"]),
 "recordsTotal"  =>  get_all_data($connect),
 "recordsFiltered" => $number_filter_row,
 "data"    => $data
);

echo json_encode($output);

?>

Javascript:

$(document).ready(function(){

     $('.input-daterange').datepicker({
      todayBtn:'linked',
      format: "yyyy-mm-dd",
      autoclose: true
     });

     fetch_data('no');

     function fetch_data(is_date_search, start_date='', end_date='')
     {
      var dataTable = $('#tabel_data').DataTable({
          "columnDefs": [ {
            "searchable": false,
            "orderable": false,
            "targets": 0
        } ],
       "order": [[ 1, 'asc' ]],
         dom: 'Bfrtip',
            buttons: [
                 {
                    extend: 'print',

                     filename: 'datatable'

                },

            ],

       "paging": false,
       "processing" : true,
       "serverSide" : true,
       bFilter:false,
       "ajax" : {
        url:"fetch.php",
        type:"POST",
        data:{
         is_date_search:is_date_search, start_date:start_date, end_date:end_date
        }, 
       }
      });
         dataTable.on('draw.dt', function () {
    var info = dataTable.page.info();
    dataTable.column(0, { search: 'applied', order: 'applied', page: 'applied', }).nodes().each(function (cell, i) {
        cell.innerHTML = i + 1 + info.start;
        dataTable.cell(cell).invalidate('dom'); 
    });
}); 


 }


     $('#search').click(function(){
      var start_date = $('#start_date').val();
      var end_date = $('#end_date').val();
      if(start_date != '' && end_date !='')
      {
       $('#tabel_data').DataTable().destroy();
       fetch_data('yes', start_date, end_date);
        document.getElementById('tabel').style.display = "block";  
      }
      else
      {
       alert("Date Required");
      }
     }); 



    });

Это просто из-за веса данных. Вы должны реализовать разбиение на страницы и / или фильтрацию на стороне сервера, чтобы уменьшить количество записей, которые необходимо отправить клиенту и отобразить.

Rory McCrossan 31.10.2018 13:28

... и, вероятно, вы установили неправильные индексы ... что вам говорит EXPLAIN?

B001ᛦ 31.10.2018 13:28

Сделали ли вы свой идентификатор первичным ключом и (если у вас не слишком много полей для запроса) поле запроса индекса (date_time). Также посмотрите на sql-инъекцию и исправьте свой код :) Кроме того, вам не нужно подсчитывать результаты для SELECT *, просто используйте SELECT COUNT(id), который возвращает количество строк

Zyigh 31.10.2018 13:29

в дополнение к другим комментариям 10000 - это очень мало

DevDonkey 31.10.2018 13:29

Возможно, для базы данных MySQL, но DOM, скорее всего, будет бороться с этим объемом данных в зависимости от того, как он отображается.

Rory McCrossan 31.10.2018 13:30

не по теме, но: ваш код уязвим для инъекций SQL, потому что вы не очищаете свои входные данные и не передаете их непосредственно в базу данных.

Doğan Uçar 31.10.2018 13:37
1
6
960
1

Ответы 1

1) используйте разбиение на страницы как использовать разбиение на страницы с PHP и mysql вместо простого запроса, как показано ниже.

"SELECT * FROM data";

2) Точка select *, потому что * выберет ненужные поля, а вместо этого определит имя столбца, для которого вы хотите отобразить данные.

пример:

select name,page,amt from data 

ваш окончательный запрос будет выглядеть так

SELECT emp_id, emp_name, emp_salary FROM employee LIMIT $offset, $rec_limit;

проверьте ссылку выше, как использовать разбиение на страницы с PHP и mysql

Другие вопросы по теме