Consultas no MySQL com PHP demoram demais
Não estou com um problema em si, mas estou querendo melhorar o desempenho, no seguinte exemplo, eu faço a consulta na tabela empresas, e com base nas empresas, eu consulto quantos parcelamentos essa empresa possui, mas, além disso, além de contar quantos parcelamentos a empresa possui, eu preciso contar o total de parcelas, então são três camadas de tabelas:
Lista empresas -
Empresa -> Parcelamentos -> Parcelas por parcelamento
OBS: a mesma empresa pode ter vários parcelamentos.
OBS 2: são quantidades enormes de parcelas, e as parcelas não tem dados fixos, então cada parcela é uma linha no banco de dados.
Com o código abaixo, eu faço isso descrito acima (funciona):
<?php
$sql = "SELECT id,cod,empresa_rel,qntd_parc FROM control_parc_fiscal";
$parcs = Components::get_rs_array_stmt_PDO($sql);
$emps_cod = array_column($parcs, 'empresa_rel');
$SQL_emp_cod = implode("','", $emps_cod);
if ($nivel <= 3) {
$sql_2 = "SELECT id,cod,nome,cnpj,insc_estadual,tributacao FROM empresas_base WHERE cod IN ('$SQL_emp_cod') AND responsavel = '$user' GROUP BY id ORDER BY id";
} else {
$sql_2 = "SELECT id,cod,nome,cnpj,insc_estadual,tributacao FROM empresas_base WHERE cod IN ('$SQL_emp_cod')";
}
$emps = Components::get_rs_array_stmt_PDO($sql_2);
$countParcs = Components::get_count_reg_mysql_PDO($sql_2);
$i = 0;
foreach ($emps as $emps_loop) {
$emps_data[$i]['id'] = $emps_loop['id'];
$emps_data[$i]['cod'] = $emps_loop['cod'];
$emps_data[$i]['nome'] = $emps_loop['nome'];
$emps_data[$i]['cnpj'] = $emps_loop['cnpj'];
$emps_data[$i]['insc_estadual'] = $emps_loop['insc_estadual'];
$b = 0;
foreach ($parcs as $parc) {
$cod[$b] = $parc['empresa_rel'];
$control_cod[$b] = $parc['cod'];
if ($emps_data[$i]['cod'] == $cod[$b]) {
$a = 0;
while ($a <= $b) {
if ($emps_data[$i]['cod'] == $cod[$b]) {
$emps_data[$i]['parcs'][$b] = Array(
"parc_cod" => $parc['cod'],
"qntd_parc" => $parc['qntd_parc'],
"count_venc" => $countVencParcs
);
} else {
$emps_data[$i]['parcs'] = NULL;
}
$a++;
}
$b++;
}
}
//echo $countVencParcs;
$i++;
}
for ($p = 0; $p < count($emps); $p++) {
$empresaID = $emps_data[$p]['id'];
$empresaCod = $emps_data[$p]['cod'];
$empresa = utf8_encode($emps_data[$p]['nome']);
$cnpj = $emps_data[$p]['cnpj'];
$insc_est = $emps_data[$p]['insc_estadual'];
$grupo_easy = $emps_data[$p]['grupo_easy'];
$regime_trib = $emps_data[$p]['tributacao'];
$countParcs = count($emps_data[$p]['parcs']);
//O que está fazendo a consulta ficar lenta é apenas está função
$qntdVencidas = fiscalModel::get_count_parc_venc_parcelamento_fiscal_por_emp($empresaCod);
if ($qntdVencidas['qntd_parcs_venc'] > 0) {
$tr_classes = 'danger';
$vnctMsg = " - Esta empresa possui " . $qntdVencidas['qntd_parcs_venc'] . " parcela(s) vencida(s)";
} else{
$vnctMsg = "";
$tr_classes = 'default';
}
?>
<tr class="<?php echo $tr_classes ?>">
<td>
<a href="#" class='select_emp_parcelamento_fiscal' data-empresa="<?php echo $empresaCod ?>"><i class="fa fa-plus-circle"></i></a>
</td>
<td class='td_empresa'>
<?php
echo $empresa;
echo $vnctMsg;
?>
</td>
<td>
<?php echo $cnpj ?>
</td>
<td>
<?php echo $insc_est ?>
</td>
<td>
<?php
echo $countParcs;
?>
</td>
</tr>
<?php
}
?>
Esta linha :
>
Citar
$qntdVencidas = fiscalModel::get_count_parc_venc_parcelamento_fiscal_por_emp($empresaCod);
É responsável por contar as parcelas vencidas, ela faz uma consulta, em média 5 vezes por empresa, em cerca de 60 campos, para cada uma das 311 empresas cadastradas até o momento, ou seja, são 90.000 registros.
Esse código abaixo, é o código executado por essa função
<?php
public static function get_count_parc_venc_parcelamento_fiscal_por_emp($emp) {
$query = "SELECT control_rel,data_venc FROM control_parc_fiscal_parcelas WHERE data_pgto = ''";
$rs = Components::get_rs_consulta_query($query);
$countVencParcs = 0;
$i = 0;
$hoje = date('Y-m-d');
while ($row = mysqli_fetch_array($rs)) {
$control_rel = $row['control_rel'];
$vnct = $row['data_venc'];
$data_inicial = Components::exec_format_date($vnct, 'd/m/Y', 'Y-m-d');
$verif_venc = Components::calc_diff_date_f($data_inicial, $hoje);
$sql_2 = "SELECT cod,empresa_rel FROM control_parc_fiscal WHERE cod = '$control_rel' AND empresa_rel = '$emp'";
$rs_2 = Components::get_rs_consulta_query($sql_2);
$row_2 = mysqli_fetch_array($rs_2);
$empresa = $row_2['empresa_rel'];
$cod = $row_2['cod'];
if ($control_rel == $cod) {
if ($verif_venc > 0) {
$countVencParcs += 1;
} else {
$countVencParcs += 0;
}
} else {
}
$i++;
}
$return = Array(
"empresa" => $empresa,
"qntd_parcs_venc" => $countVencParcs
);
return $return;
}
?>
Não tenho ideia de como agilizar isso, se alguém tiver uma luz do que eu deva pesquisar, sabendo que esse é o famoso problema do 'n+1', mas não consigo achar outra solução, ou seria realmente viável armazenar todos esses dados em um array ?
ObrigadoDiscussão (7)
Carregando comentários...