Relatório demora demais para ser gerado

1. Relatório demora demais para ser gerado

Felipe Schneider
felipesch

(usa Outra)

Enviado em 16/08/2016 - 09:21h

Ola pessoal.
Estou com um problema bem interessante. Tenho um sistema PHP com MySQL muito antigo e um dos relatórios demora demais para ser gerado. Chega a levar em média 3 a 4 horas. Nunca me preocupei em melhorar isso, até mesmo porque não foi eu quem fiz o sistema. Mas agora, está me gerando problemas demais. Justamente porque o servidor de hospedagem que tenho o sistema, fez algumas atualizações e mudanças, inclusive no time_exception do PHP e meu sistema não consegue gerar o relatório por completo. Ele para no meio do caminho. O relatório é para fazer uma pesquisa entre um dia X e um dia Y e trazer algumas informações de exames realizados. O BD para consulta tem mais de 200mil linhas. Abaixo está o código da pesquisa. Se alguém puder me ajudar, agradeço demais!



<?php
if (file_exists("master.php")) { include("master.php"); }
else { include("../master.php"); echo "<link href='../master.css' rel='stylesheet' type='text/css' />"; }
?>
<table width="100%" border="0" style="border:1px solid #999999; background-color:#FFFFFF;">
<? if ($_POST['imprimir'] == "") { ?>
<tr>
<td> </td>
<td align="right">
<form method="post" action="relatorios/atendimento_empresa2.php">
<input type="hidden" name="atendimento_empresa" value="<?=$_POST['atendimento_empresa'];?>" />
<input type="hidden" name="atendimento_empresa_data_dia" value="<?=$_POST['atendimento_empresa_data_dia'];?>" />
<input type="hidden" name="atendimento_empresa_data_mes" value="<?=$_POST['atendimento_empresa_data_mes'];?>" />
<input type="hidden" name="atendimento_empresa_data_ano" value="<?=$_POST['atendimento_empresa_data_ano'];?>" />
<input type="hidden" name="atendimento_empresa_data_ate_dia" value="<?=$_POST['atendimento_empresa_data_ate_dia'];?>" />
<input type="hidden" name="atendimento_empresa_data_ate_mes" value="<?=$_POST['atendimento_empresa_data_ate_mes'];?>" />
<input type="hidden" name="atendimento_empresa_data_ate_ano" value="<?=$_POST['atendimento_empresa_data_ate_ano'];?>" />

<input type="hidden" name="imprimir" value="sim" />
<input type="submit" value="imprimir" />
</form>
</td>
</tr>
<? } ?>
<?php
if ($_POST['atendimento_empresa'] != 'todas') $where_init = ' WHERE id = "' . $_POST['atendimento_empresa'] . '"';
$empresas = mysql_query("SELECT * FROM empresas{$where_init} ORDER BY `razao`");
while($selecionar = @mysql_fetch_assoc($empresas)) {

$_dia = $_POST['atendimento_empresa_data_dia'];
$_mes = $_POST['atendimento_empresa_data_mes'];
$_ano = $_POST['atendimento_empresa_data_ano'];
$__dia = $_POST['atendimento_empresa_data_ate_dia'];
$__mes = $_POST['atendimento_empresa_data_ate_mes'];
$__ano = $_POST['atendimento_empresa_data_ate_ano'];
$where = "((ano > $_ano) OR ((ano = $_ano) AND (mes > $_mes)) OR ((ano = $_ano) AND (mes = $_mes) AND (dia >= $_dia))) AND ((ano < $__ano) OR ((ano = $__ano) AND (mes < $__mes)) OR ((ano = $__ano) AND (mes = $__mes) AND (dia <= $__dia)))";
$selecionar_cliente = mysql_query("SELECT * FROM clientes_old WHERE (id_emp = '".$selecionar['id']."') AND (opcao != 'ficha') AND ".$where." ORDER BY 'nome'");
if ((mysql_num_rows($selecionar_cliente) > "0") or ($_POST['atendimento_empresa'] != 'todas')) {
?>
<tr>
<td><center>
<b>Histórico de exames da empresa <i><?=utf8_encode($selecionar['razao'])?></i> de <?=$_POST['atendimento_empresa_data_dia']?>/<?=$_POST['atendimento_empresa_data_mes']?>/<?=$_POST['atendimento_empresa_data_ano']?> até <?=$_POST['atendimento_empresa_data_ate_dia']?>/<?=$_POST['atendimento_empresa_data_ate_mes']?>/<?=$_POST['atendimento_empresa_data_ate_ano']?></b>
</center></td>
</tr>
<tr><td> </td></tr>
<tr><td>
<?
if (mysql_num_rows($selecionar_cliente) <= "0") {
echo "<tr><td>Sem histórico para esta empresa.</td></tr>";
}
else {
$setores = array();
while ($x = mysql_fetch_assoc($selecionar_cliente)) {
if (!in_array(trim(strtr(strtoupper($x['setor']),"áéíóúâêôãõàèìòùç","ÁÉÍÓÚÂÊÔÃÕÀÈÌÒÙÇ")), $setores)) {
$conta = "1";
echo "<table width='100%' border=1>";
echo "<tr><td width='5%'> </td><td width='45%'><b>Setor:</b> ".utf8_encode($x['setor'])."</td><td width='10%'></td><td width='10%'></td></tr>";
echo "<tr><td width='5%'><center> </center></td><td width='45%'><center><b>Funcionário</b></center></td><td width='10%'><center><b>Data realização</b></center></td><td width='10%'><center><b>Exames</b></center></td></tr>";


$selecionar_adm = mysql_query("SELECT * FROM clientes_old WHERE (id_emp = '".$selecionar['id']."' and setor = '".$x['setor']."' and exame_clinico = 'Admissional' and opcao = 'aso') and ".$where);
if (mysql_num_rows($selecionar_adm) > "0") {
while ($y = mysql_fetch_assoc($selecionar_adm)) {
echo "<tr><td width='5%'>".$conta."</td><td width='45%'>".utf8_encode($y['nome'])."</td><td width='10%'><center>".$y['dia']."/".$y['mes']."/".$y['ano']."</center></td><td width='10%'><center>".$y['exame_clinico']."</center></td></tr>";
$conta++;
}
}


$selecionar_dem = mysql_query("SELECT * FROM clientes_old WHERE (id_emp = '".$selecionar['id']."' and setor = '".$x['setor']."' and exame_clinico = 'Demissional' and opcao = 'aso') and ".$where);
if (mysql_num_rows($selecionar_dem) > "0") {
while ($y = mysql_fetch_assoc($selecionar_dem)) {
echo "<tr><td width='5%'>".$conta."</td><td width='45%'>".utf8_encode($y['nome'])."</td><td width='10%'><center>".$y['dia']."/".$y['mes']."/".$y['ano']."</center></td><td width='10%'><center>".$y['exame_clinico']."</center></td></tr>";
$conta++;
}
}


$selecionar_per = mysql_query("SELECT * FROM clientes_old WHERE (id_emp = '".$selecionar['id']."' and setor = '".$x['setor']."' and exame_clinico = 'Periódico' and opcao = 'aso') and ".$where);
if (mysql_num_rows($selecionar_per) > "0") {
while ($y = mysql_fetch_assoc($selecionar_per)) {
echo "<tr><td width='5%'>".$conta."</td><td width='45%'>".utf8_encode($y['nome'])."</td><td width='10%'><center>".$y['dia']."/".$y['mes']."/".$y['ano']."</center></td><td width='10%'><center>".utf8_encode($y['exame_clinico'])."</center></td></tr>";
$conta++;
}
}


$selecionar_ret = mysql_query("SELECT * FROM clientes_old WHERE (id_emp = '".$selecionar['id']."' and setor = '".$x['setor']."' and exame_clinico = 'Retorno ao Trabalho' and opcao = 'aso') and ".$where);
if (mysql_num_rows($selecionar_ret) > "0") {
while ($y = mysql_fetch_assoc($selecionar_ret)) {
echo "<tr><td width='5%'>".$conta."</td><td width='45%'>".utf8_encode($y['nome'])."</td><td width='10%'><center>".$y['dia']."/".$y['mes']."/".$y['ano']."</center></td><td width='10%'><center>".$y['exame_clinico']."</center></td></tr>";
$conta++;
}
}


$selecionar_mud = mysql_query("SELECT * FROM clientes_old WHERE (id_emp = '".$selecionar['id']."' and setor = '".$x['setor']."' and exame_clinico = 'Mudança Função' and opcao = 'aso') and ".$where);
if (mysql_num_rows($selecionar_mud) > "0") {
while ($y = mysql_fetch_assoc($selecionar_mud)) {
echo "<tr><td width='5%'>".$conta."</td><td width='45%'>".utf8_encode($y['nome'])."</td><td width='10%'><center>".$y['dia']."/".$y['mes']."/".$y['ano']."</center></td><td width='10%'><center>".utf8_encode($y['exame_clinico'])."</center></td></tr>";
$conta++;
}
}

$selecionar_audio = mysql_query("SELECT * FROM clientes_old WHERE (id_emp = '".$selecionar['id']."' and setor = '".$x['setor']."' and opcao = 'audio') and ".$where);
if (mysql_num_rows($selecionar_audio) > "0") {
while ($y = mysql_fetch_assoc($selecionar_audio)) {
echo "<tr><td width='5%'>".$conta."</td><td width='45%'>".utf8_encode($y['nome'])."</td><td width='10%'><center>".$y['dia']."/".$y['mes']."/".$y['ano']."</center></td><td width='10%'><center>Audiometria</center></td></tr>";
$conta++;
}
}

$selecionar_ficha = mysql_query("SELECT * FROM clientes_old WHERE (id_emp = '".$selecionar['id']."' and setor = '".$x['setor']."' and opcao = 'atendimento') and ".$where);
if (mysql_num_rows($selecionar_ficha) > "0") {
while ($y = mysql_fetch_assoc($selecionar_ficha)) {
echo "<tr><td width='5%'>".$conta."</td><td width='45%'>".utf8_encode($y['nome'])."</td><td width='10%'><center>".$y['dia']."/".$y['mes']."/".$y['ano']."</center></td><td width='10%'><center>Atend. clínico</center></td></tr>";
$conta++;
}
}

$selecionar_comp = mysql_fetch_assoc(mysql_query("SELECT * FROM empresas_setores WHERE id_emp = '".$x['id_emp']."' AND setor = '".$x['setor']."' AND funcao = '".$x['funcao']."' LIMIT 1"));
$selecionar_exames = mysql_query("SELECT * FROM clientes_old WHERE (id_emp = '".$selecionar['id']."' and setor = '".$x['setor']."' and exames != '' and exames_feed != 'ausente' and opcao = 'aso') and ".$where);
if (mysql_num_rows($selecionar_exames) > "0") {
while ($y = mysql_fetch_assoc($selecionar_exames)) {
echo "<tr><td width='5%'>".$conta."</td><td width='45%'>".utf8_encode($y['nome'])."</td><td width='10%'><center>".$y['dia']."/".$y['mes']."/".$y['ano']."</center></td><td width='10%'><center>".utf8_encode($y['exames'])."</center></td></tr>";
$conta++;
}
}

echo "</table><br>";
$setores[] = trim(strtr(strtoupper($x['setor']),"áéíóúâêôãõàèìòùç","ÁÉÍÓÚÂÊÔÃÕÀÈÌÒÙÇ"));
}
}
}
}
echo '</td></tr>';
}
?>
</td></tr>

</table>
<?php if ($_POST['imprimir'] != "") { echo "<script>window.print(); history.back();</script>"; } ?>




  


2. Re: Relatório demora demais para ser gerado

Fabiano
fpires

(usa Debian)

Enviado em 16/08/2016 - 13:29h

Provavelmente seu banco não está otimizado. Verifique possíveis otimizações na parte de memória do MySQL (se você tiver acesso a isso). Verifique também o log de consultas lentas (slow query log), e se é possível criar índices que auxiliem nas consultas realizadas. Existem scripts (como o MySQL Tunning Primmer - http://www.day32.com/MySQL/ e o mysqltunner.pl - http://mysqltuner.com/) que analisam seu banco e exibem algumas recomendações.


3. Re: Relatório demora demais para ser gerado

euteste da silva
foxbit3r

(usa Solaris)

Enviado em 16/08/2016 - 17:50h

Olhe os logs do mysql e do sistema operacional, pois se tiver alguma coisa errada lá você vai encontrar algum informativo.




4. Re: Relatório demora demais para ser gerado

Felipe Schneider
felipesch

(usa Outra)

Enviado em 17/08/2016 - 11:27h

fpires escreveu:

Provavelmente seu banco não está otimizado. Verifique possíveis otimizações na parte de memória do MySQL (se você tiver acesso a isso). Verifique também o log de consultas lentas (slow query log), e se é possível criar índices que auxiliem nas consultas realizadas. Existem scripts (como o MySQL Tunning Primmer - http://www.day32.com/MySQL/ e o mysqltunner.pl - http://mysqltuner.com/)">http://mysqltuner.com/) que analisam seu banco e exibem algumas recomendações.


Amigo... agradeço as recomendações, mas não tenho noção do que você pediu para fazer.
Quanto aos scripts utilizei o mysqltuner e trouxe o relatório abaixo. Tens como me "traduzir" com o que posso melhorar?


[root@li1281-24 ~]# perl mysqltuner.pl
>> MySQLTuner 1.6.15 - Major Hayden <major@mhtx.net>
>> Bug reports, feature requests, and downloads at http://mysqltuner.com/
>> Run with '--help' for additional options and output filtering

[--] Skipped version check for MySQLTuner script
Please enter your MySQL administrative login: root
Please enter your MySQL administrative password: [OK] Currently running supporte d MySQL version 5.5.51
[OK] Operating on 64-bit architecture

-------- Storage Engine Statistics --------------------------------------------- --------------------
[--] Status: +ARCHIVE +BLACKHOLE +CSV -FEDERATED +InnoDB +MEMORY +MRG_MYISAM +My ISAM +PERFORMANCE_SCHEMA
[--] Data in MyISAM tables: 163M (Tables: 36)
[!!] InnoDB is enabled but isn't being used
[OK] Total fragmented tables: 0

-------- Security Recommendations ---------------------------------------------- --------------------
[OK] There are no anonymous accounts for any database users
[OK] All database users have passwords assigned
[!!] User 'root@%' hasn't specific host restriction.
[--] There are 605 basic passwords in the list.

-------- CVE Security Recommendations ------------------------------------------ --------------------
[OK] NO SECURITY CVE FOUND FOR YOUR VERSION

-------- Performance Metrics --------------------------------------------------- --------------------
[--] Up for: 1h 54m 20s (38 q [0.006 qps], 20 conn, TX: 82K, RX: 4K)
[--] Reads / Writes: 100% / 0%
[--] Binary logging is disabled
[--] Physical Memory : 2.0G
[--] Max MySQL memory : 583.2M
[--] Other process memory: 181.5M
[--] Total buffers: 168.0M global + 2.8M per thread (151 max threads)
[--] P_S Max memory usage: 0B
[--] Galera GCache Max memory usage: 0B
[OK] Maximum reached memory usage: 173.5M (8.68% of installed RAM)
[OK] Maximum possible memory usage: 583.2M (29.17% of installed RAM)
[OK] Overall possible memory usage with other process is compatible with memory available
[OK] Slow queries: 0% (0/38)
[OK] Highest usage of available connections: 1% (2/151)
[!!] Aborted connections: 60.00% (12/20)
[!!] name resolution is active : a reverse name resolution is made for each new connection and can reduce performance
[!!] Query cache may be disabled by default due to mutex contention.
[OK] No Sort requiring temporary tables
[OK] No joins without indexes
[OK] Temporary tables created on disk: 25% (26 on disk / 101 total)
[OK] Table cache hit rate: 90% (63 open / 70 opened)
[OK] Open file limit used: 8% (92/1K)
[OK] Table locks acquired immediately: 100% (43 immediate / 43 locks)

-------- Performance schema ---------------------------------------------------- --------------------
[--] Performance schema is disabled.

-------- ThreadPool Metrics ---------------------------------------------------- --------------------
[--] ThreadPool stat is disabled.

-------- MyISAM Metrics -------------------------------------------------------- --------------------
[!!] Key buffer used: 18.2% (1M used / 8M cache)
[!!] Key buffer size / total MyISAM indexes: 8.0M/10.4M

-------- AriaDB Metrics -------------------------------------------------------- --------------------
[--] AriaDB is disabled.

-------- InnoDB Metrics -------------------------------------------------------- --------------------
[--] InnoDB is disabled.
[!!] InnoDB Storage engine is disabled. InnoDB is the default storage engine

-------- TokuDB Metrics -------------------------------------------------------- --------------------
[--] TokuDB is disabled.

-------- Galera Metrics -------------------------------------------------------- --------------------
[--] Galera is disabled.

-------- Replication Metrics --------------------------------------------------- --------------------
[--] Galera Synchronous replication: NO
[--] No replication slave(s) for this server.
[--] This is a standalone server.

-------- Recommendations ------------------------------------------------------- --------------------
General recommendations:
Add skip-innodb to MySQL configuration to disable InnoDB
Restrict Host for user@% to user@SpecificDNSorIp
MySQL started within last 24 hours - recommendations may be inaccurate
Enable the slow query log to troubleshoot bad queries
Reduce or eliminate unclosed connections and network issues
Configure your accounts with ip or subnets only, then update your configurat ion with skip-name-resolve=1
Variables to adjust:
query_cache_type (=0)
key_buffer_size (> 10.4M)




5. Re: Relatório demora demais para ser gerado

Felipe Schneider
felipesch

(usa Outra)

Enviado em 17/08/2016 - 11:29h

foxbit3r escreveu:

Olhe os logs do mysql e do sistema operacional, pois se tiver alguma coisa errada lá você vai encontrar algum informativo.



Aonde vejo isso, amigo?






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts