SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



CronJob-Service    
bei SELFPHP mit ...



 + minütlichen Aufrufen
 + eigenem Crontab Eintrag
 + unbegrenzten CronJobs
 + Statistiken
 + Beispielaufrufen
 + Control-Bereich

Führen Sie mit den CronJobs von SELFPHP zeitgesteuert Programme auf Ihrem Server aus. Weitere Infos



:: Buchempfehlung ::

Der CSS-Problemlöser

Der CSS-Problemlöser zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > MySQLi/PDO/(MySQL)

MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren

Antwort
 
Themen-Optionen Ansicht
  #11  
Alt 04.06.2018, 22:31:07
AlexD AlexD ist offline
Junior Member
 
Registriert seit: Jun 2003
Beiträge: 186
AW: mehrere Tabellen über Timestamp abfragen

So ich hab jetzt eine Lösung gefunden.

Ich lasse das nicht mehr in einem Query, sondern mach es über mehrere Abfragen und dann mit Arrays.

Das Abarbeiten der Funktion dauert jetzt je nach Zeitraum ca. 8 Sekunden.

So sieht das im Moment aus:
PHP-Code:
function hzg_pvbetrieb_einzel($von=NULL$bis=NULL$betriebsart=NULL){
    include(
'sql_connect.php');

    
//*** Betriebsarten***
    // 0 = Heizen
    // 5 = Warmwasser
    // 12 = Photovoltaik
    // 17 = ZWE (Zweitwärmeerzäuger -> Heizstab)
    

    
$verbrauch NULL;
    
$ausgabe   NULL;
    
$i=0;
    
// Datum der Form dd.mm.yyyy umwandeln in YYYY-mm-dd
    
if($von !== NULL && $bis !== NULL){

        
$vondatum_split explode(".",$von);
        
$vondatum $vondatum_split[2]."-".$vondatum_split[1]."-".$vondatum_split[0];

        
$bisdatum_split explode(".",$bis);
        
$bisdatum $bisdatum_split[2]."-".$bisdatum_split[1]."-".$bisdatum_split[0];

        
$zeitraum " BETWEEN  '".$vondatum."' AND '".$bisdatum."'";
    }
    
    
    
    
//===== WEBSERVER-Daten der Heizung ===============
    
$sql_webquery "SELECT wp_status, CONVERT(DATE_FORMAT(timestamp,'%Y-%m-%d-%H:%i:00'), DATETIME) AS w_timestamp, TBWsoll
                       FROM heizung_webdaten
                      WHERE timestamp "
.$zeitraum."
                        AND wp_status = "
.$betriebsart."
                   ORDER BY w_timestamp"
;
    

    
$result $mysqli->query($sql_webquery);
    echo 
$mysqli->error;
    while(
$daten $result->fetch_array(MYSQLI_ASSOC)){

        
        
$webdaten[$i] = array('timestamp' => $daten['w_timestamp'],
                              
'wp_status' => $daten['wp_status'],
                              
'TBWsoll'   => $daten['TBWsoll']);
        
$i++;
        
    }
    
    


    
//======= DATEN Stromzähler für Heizung ==============
    
$sql_hzquery "SELECT WirkenergieSigmaL_imp, WirkleistungSigmaL, CONVERT(DATE_FORMAT(timestamp,'%Y-%m-%d-%H:%i:00'), DATETIME) AS timestamp
                       FROM strom_heizungsdaten
                      WHERE timestamp "
.$zeitraum."
                   ORDER BY timestamp"
;


    
$result $mysqli->query($sql_hzquery);
    echo 
$mysqli->error;
    while(
$hzdaten $result->fetch_array(MYSQLI_ASSOC)){

        
$hzstrom[$hzdaten['timestamp']] = array('WirkenergieSigmaL_imp' => $hzdaten['WirkenergieSigmaL_imp'],
                                                
'WirkleistungSigmaL'    => $hzdaten['WirkleistungSigmaL']);

    }
    

    
//======= DATEN Stromzähler Haus-Gesamt ===================
    
$sql_hausstrom "SELECT CONVERT(DATE_FORMAT(timestamp,'%Y-%m-%d-%H:%i:00'), DATETIME) AS timestamp, WirkleistungSigmaL
                        FROM strom_hausdaten
                       WHERE timestamp "
.$zeitraum."
                    ORDER BY timestamp"
;
                    

    
$result $mysqli->query($sql_hausstrom);
    echo 
$mysqli->error;
    while(
$hausdaten $result->fetch_array(MYSQLI_ASSOC)){

        
$hausstrom[$hausdaten['timestamp']] = array('WirkleistungSigmaL' => $hausdaten['WirkleistungSigmaL']);

    }
    

    
//======== DATEN Heizung ================================
    
$sql_hzgquery "SELECT datum, uhrzeit, TRLsoll, TRLext, TBW
                        FROM heizung_daten
                       WHERE datum "
.$zeitraum."
                    ORDER BY datum, uhrzeit"
;


    
$result $mysqli->query($sql_hzgquery);
    echo 
$mysqli->error;
    while(
$hzgdaten $result->fetch_array(MYSQLI_ASSOC)){

        
$zeit_split explode(":"$hzgdaten['uhrzeit']);
        
$tstamp $hzgdaten['datum']." ".$zeit_split[0].":".$zeit_split[1].":00";
        

        
$heizungsdaten[$tstamp] = array('TRLsoll' => $hzgdaten['TRLsoll'],
                                           
'TRList' => $hzgdaten['TRLext'],
                                           
'TBW'    => $hzgdaten['TBW']);


    }

    
    
//======== Zusammenführen der einzelnen Daten in ein Array ========
    
foreach($webdaten AS $k => $webvalues){

        if(!isset(
$heizungsdaten[$webvalues['timestamp']]['TRLsoll'])){
            
$heizungsdaten[$webvalues['timestamp']]['TRLsoll'] = NULL;
        }
        if(!isset(
$heizungsdaten[$webvalues['timestamp']]['TRList'])){
            
$heizungsdaten[$webvalues['timestamp']]['TRList'] = NULL;
        }
        if(!isset(
$heizungsdaten[$webvalues['timestamp']]['TBW'])){
            
$heizungsdaten[$webvalues['timestamp']]['TBW'] = NULL;
        }

        
$pv_heizdaten[] = array('timestamp' => $webvalues['timestamp'],
                                
'wp_status' => $webvalues['wp_status'],
                                
'WirkenergieSigmaL_imp' => $hzstrom[$webvalues['timestamp']]['WirkenergieSigmaL_imp'],
                                
'Wirkleistung_hzg'      => $hzstrom[$webvalues['timestamp']]['WirkleistungSigmaL'],
                                
'Wirkleistung_haus'     => $hausstrom[$webvalues['timestamp']]['WirkleistungSigmaL'],
                                
'TRLsoll'               => $heizungsdaten[$webvalues['timestamp']]['TRLsoll'],
                                
'TRList'               => $heizungsdaten[$webvalues['timestamp']]['TRList'],
                                
'TBWist'               => $heizungsdaten[$webvalues['timestamp']]['TBW'],
                                
'TBWsoll'              => $webvalues['TBWsoll']);

    }
    
    
    
//=== zusammenhängende Datensätze im Array gruppieren ==
    
$i=0;
    foreach(
$pv_heizdaten AS $k => $data){

        if(
$k == 0){
            
$group_data[$i][$k] = array('timestamp'             => $data['timestamp'],
                                        
'wp_status'             => $data['wp_status'],
                                        
'WirkenergieSigmaL_imp' => $data['WirkenergieSigmaL_imp'],
                                        
'Wirkleistung_hzg'      => $data['Wirkleistung_hzg'],
                                        
'Wirkleistung_haus'     => $data['Wirkleistung_haus'],
                                        
'TRLsoll'               => $data['TRLsoll'],
                                        
'TRList'                => $data['TRList'],
                                        
'TBWist'                => $data['TBWist'],
                                        
'TBWsoll'               => $data['TBWsoll']);
        } else {

            
$vk $k-1;
            
$diff strtotime($data['timestamp']) - strtotime($pv_heizdaten[$vk]['timestamp']);

            if(
$diff == 60){

                
$group_data[$i][$k] = array('timestamp'         => $data['timestamp'],
                                        
'wp_status'             => $data['wp_status'],
                                        
'WirkenergieSigmaL_imp' => $data['WirkenergieSigmaL_imp'],
                                        
'Wirkleistung_hzg'      => $data['Wirkleistung_hzg'],
                                        
'Wirkleistung_haus'     => $data['Wirkleistung_haus'],
                                        
'TRLsoll'               => $data['TRLsoll'],
                                        
'TRList'                => $data['TRList'],
                                        
'TBWist'                => $data['TBWist'],
                                        
'TBWsoll'               => $data['TBWsoll']);
            } else {
                
$i++;
                
$group_data[$i][$k] = array('timestamp'         => $data['timestamp'],
                                        
'wp_status'             => $data['wp_status'],
                                        
'WirkenergieSigmaL_imp' => $data['WirkenergieSigmaL_imp'],
                                        
'Wirkleistung_hzg'      => $data['Wirkleistung_hzg'],
                                        
'Wirkleistung_haus'     => $data['Wirkleistung_haus'],
                                        
'TRLsoll'               => $data['TRLsoll'],
                                        
'TRList'                => $data['TRList'],
                                        
'TBWist'                => $data['TBWist'],
                                        
'TBWsoll'               => $data['TBWsoll']);
            }
        }

    }
    
    
    
//============== Berechnung des Verbrauchs =================================
    
    
return $group_data;
}


//========= Gibt dieses Array aus =============
Abfrage dauerte3 Sek.

Array
(
    [
0] => Array
        (
            [
0] => Array
                (
                    [
timestamp] => 2018-05-01 11:40:00
                    
[wp_status] => 12
                    
[WirkenergieSigmaL_imp] => 5624.8008
                    
[Wirkleistung_hzg] => 3.2618
                    
[Wirkleistung_haus] => -2.4285
                    
[TRLsoll] => 56.0
                    
[TRList] => 34.8
                    
[TBWist] => 49.2
                    
[TBWsoll] => 
                )

            [
1] => Array
                (
                    [
timestamp] => 2018-05-01 11:41:00
                    
[wp_status] => 12
                    
[WirkenergieSigmaL_imp] => 5624.8379
                    
[Wirkleistung_hzg] => 3.2658
                    
[Wirkleistung_haus] => 1.3247
                    
[TRLsoll] => 56.0
                    
[TRList] => 35.1
                    
[TBWist] => 49.1
                    
[TBWsoll] => 
                )

            [
2] => Array
                (
                    [
timestamp] => 2018-05-01 11:42:00
                    
[wp_status] => 12
                    
[WirkenergieSigmaL_imp] => 5624.9043
                    
[Wirkleistung_hzg] => 1.1184
                    
[Wirkleistung_haus] => 0.8235
                    
[TRLsoll] => 56.0
                    
[TRList] => 36.0
                    
[TBWist] => 49.2
                    
[TBWsoll] => 
                )

        )

    [
1] => Array
        (
            [
3] => Array
                (
                    [
timestamp] => 2018-05-01 14:38:00
                    
[wp_status] => 12
              
           

Mit Zitat antworten
  #12  
Alt 28.12.2018, 17:52:00
AlexD AlexD ist offline
Junior Member
 
Registriert seit: Jun 2003
Beiträge: 186
AW: mehrere Tabellen über Timestamp abfragen

Hallo zusammen,

jetzt muss ich den Thread doch nochmal hervorziehen.... wenn mal so viele Daten in der Datenbank wird's doch etwas komplizierter die Performance zu halten.


Ich habe die letzten Tage einfach ein wenig in PHPMyAdmin rumgespielt und auch die Queries immer wieder mal mit EXPLAIN anzeigen und auch Messen lassen.

Dabei musste ich feststellen, dass sehr viel Zeit für "Creating Sort Index" aufgewendet wird, hier reden wir von ca. 2 Sekunden pro Abfrage (5 Abfragen sind es).
Im Internet bin ich nicht so richtig fündig geworden.
Wie kann ich diesen Wert minimieren???

Bei allen Tabellen liegt ein Index über 'timestamp'. Hab aber festgestellt, das MySQL diesen INDEX nicht nutzt (EXPLAIN SELECT....)
Bei 'possible_keys' steht: timestamp
key => NULL
key_len => NULL
Extras => using Where; using Filesort

Lege ich jedoch eine Mehrspaltigen Index (z.B. idx_twl) über (timestamp, WirkenergieSigmaL_imp, WirkleistungSigmaL)

SELECT CONVERT(DATE_FORMAT(timestamp,'%Y-%m-%d %H:%i:00'), DATETIME) AS timestamp, WirkenergieSigmaL_imp, WirkleistungSigmaL FROM strom_heizungsdaten WHERE timestamp BETWEEN '2018-01-01 00:00:00' AND '2018-12-26 23:59:59' ORDER BY timestamp


wird der Index laut PHPMyAdmin verwendet
key => idx_twl
key_len => 5
Extras => using Where; Using index; Using filesort

Allerdings bleibt es bei den 2 Sekunden für "Creating Sort Index" laut Messung.

Die Tabellen sind mitlerweile doch sehr umfangreich und lass mir bei der Funktion auch mal die Laufzeiten mit ausgeben die ich durch 'microtime()' mit ermittle.
Hier sieht man auch, dass die Laufzeiten der While-Schleifen nach der DB-Abfrage auch einiges an Zeit beanspruchen.
Allerdings werden pro Abfrage ca. 500.000 Datensätze verarbeitet.

Hier mal das Array:
Code:
Abfrage dauerte: 14.422704935074 Sek.

Array
(
    [debug] => Array
        (
            [laufzeiten] => Array
                (
                    [query_webserverdaten] => 0.51565
                    [query_stromhzg] => 2.64078
                    [query_stromhaus] => 2.45327
                    [query_daten_heizung] => 2.04699
                    [hzgdaten_schleife] => 2.01574
                    [query_pv_daten] => 4.35963
                    [pv_schleife] => 1.03131
                    [array_gesamtdaten] => 0.59378
                    [array_gruppieren] => 0.4219
                    [array_pvanteilpur] => 0.09376
                    [array_berechnungen] => 0
                    [gesamtzeit] => 14.17269
                )

        )

    [zeitraum] => 2018-01-01|2018-12-26
    [datensaetze] => 37875
    [gesamtsumme_kwh] => 1886.8117
    [pv_pur_kwh] => 762.9697
    [pv_anteil_kwh] => 225.193
    [gesamt_laufzeit] => 2111820
)
Datensätze in den einzelnen Tabellen:
[webserverdaten] => 354.000
[stromhzg] => 642.000
[stromhaus] => 645.000
[daten_heizung] => 723.000
[pv_daten] => 1.556.000


Vielleicht hat ja jemand noch eine Idee, wie ich das performanter gestalten könnte.
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
mehrere Tabellen mit teilweise gleichem Titel mit PHP abfragen tobi28862 MySQLi/PDO/(MySQL) 2 23.07.2009 10:46:08
zwei Tabellen abfragen crowl MySQLi/PDO/(MySQL) 4 18.04.2008 13:31:55
mehrere tabellen abfragen scones MySQLi/PDO/(MySQL) 6 09.05.2007 21:23:20
Db abfragen von 2 tabellen GrafvonHenneber PHP Grundlagen 6 22.01.2003 16:37:48
mysql querverbindungen aus tabellen abfragen flobee PHP für Fortgeschrittene und Experten 2 17.06.2002 18:16:49


Alle Zeitangaben in WEZ +2. Es ist jetzt 17:10:10 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt