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 ::

PHP 5.3 & MySQL 5.1

PHP 5.3 & MySQL 5.1 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
  #1  
Alt 01.04.2011, 16:56:35
Daktari Daktari ist offline
Anfänger
 
Registriert seit: Apr 2011
Alter: 51
Beiträge: 49
extrem langsame Abfrage..

Hallo Forum!

Ich bau uns gerade ein neues Programm für unsere Firma und hänge gewaltig an der zweiten (die erste war nicht so dramatisch) Abfrage des MySQL-Servers.
Der Select-Befehl lautet:
Code:
SELECT     tabAuftrag.Auftragsnr,  tabAuftrag.AufDat,  tabAuftrag.EDatum,  tabAuftrag.Location,  tabAuftrag.Kommentar,
                       tabAuftrag.Auftragssorte,  tabAuftrag.Adminnr,  tabAuftrag.AufMwst,  tabAuftrag.Zahlungsbednr,  tabAuftrag.Kundennr,
                       tabAuftrag.Endkundennr,  tabAuftrag.Endkundenref,  tabAuftrag.Lieferbed,  tabAuftrag.Angebotsnr,  tabAuftrag.Ansprechpartnernr,
                       tabAuftrag.LAFirma1,  tabAuftrag.LAFirma2,  tabAuftrag.LAStrasse,  tabAuftrag.LAPLZ,  tabAuftrag.LAStadt,  tabAuftrag.LALand,
                       tabZahlungsbedingung.Zahlungsbed,  tabAdressen.Kommentar AS KundenKommentar,  tabAdressen.Zahlungsbedingungen,
                       tabAdressen.Laendercode,  tabAdressen.RLand,  tabAdressen.RStadt,  tabAdressen.RFirma1,  tabAdressen.Sprache, 
                       tabAdressen.RFirma2,  tabAdressen.RStrasse,  tabAdressen.RPLZ,  tabAdressen.Kundennummer,  tabAdressen.gesperrt,
                       tabAdressen.Mwst,  tabAdressen.RSonstiges,  tabLand.Landsprache,  tabAuftragssorte.ArtKurz,  tabAuftragssorte.Art, 
                      tabAdmin_1.Kuerzel,  tabAuftrag.LDatum,  tabAuftrag.VersicherungProzent,  tabAuftrag.VerpackungProzent,  tabAuftrag.AP, 
                       tabAdressen.RTelefon,  tabAdressen.RFax, tabAdmin_1.AdminNr AS AdminnrA,  tabAuftragssorte.Nr,  tabLand.Landnr,
                       tabZahlungsbedingung.Zahlungsbednr AS ZNr,  tabRechnung.Rechnungsnr,  tabRechnung.Datum AS DatumR,  tabAuftrag.KuBestellnr, 
                       tabLieferschein2.Lieferscheinnr,  tabLieferschein2.Datum AS DatumL,  tabLieferschein2.IndexL,  tabLieferschein2.LSVer,
                       tabAdressen.QuotientZZiel,  tabAdressen.Vorkasse,  tabAdressen.Lieferantennummer,  tabAdressen.RUstIDNr,
                       tabAngebot.AufDatAn,  tabAuftrag.indexan, tabAdmin_1.Kuerzel AS AnK,  tabAngebot.Ver,  tabAngebot.Angebotsnr AS ANgebnr,
                       tabLaendercode.Zollhinweis,  tabAuftrag.Kundenref
FROM          tabLaendercode RIGHT OUTER JOIN
                       tabAuftrag ON  tabLaendercode.Land =  tabAuftrag.LALand LEFT OUTER JOIN
                       tabAngebot LEFT OUTER JOIN
                       tabAdmin AS tabAdmin_1 ON  tabAngebot.Adminnr = tabAdmin_1.AdminNr ON 
                       tabAuftrag.indexan =  tabAngebot.IndexAn LEFT OUTER JOIN
                       tabLieferschein2 ON  tabAuftrag.Auftragsnr =  tabLieferschein2.Auftragsnr LEFT OUTER JOIN
                       tabRechnung ON  tabAuftrag.Auftragsnr =  tabRechnung.AuftragsnrR LEFT OUTER JOIN
                       tabAdmin AS tabAdmin_2 ON  tabAuftrag.Adminnr = tabAdmin_2.AdminNr LEFT OUTER JOIN
                       tabAuftragssorte ON  tabAuftrag.Auftragssorte =  tabAuftragssorte.Nr LEFT OUTER JOIN
                       tabAdressen LEFT OUTER JOIN
                       tabZahlungsbedingung ON  tabAdressen.Zahlungsbedingungen =  tabZahlungsbedingung.Zahlungsbednr LEFT OUTER JOIN
                       tabLand ON  tabAdressen.Sprache =  tabLand.Landnr ON  tabAuftrag.Kundennr =  tabAdressen.Kundennummer
ORDER BY  tabAuftrag.Auftragsnr DESC
Diese dauert über den Query Browser gut 1500s! Übernommen habe ich die Abfrage vom MSSQL-Server mit dem wir aktuell arbeiten und auf dem das ganze recht flott funktioniert.
Also hab ich mich auf die Suche gemacht und folgende Punkte abgearbeitet (ob sinnvoll oder nicht kann mir vllt noch jemand sagen):
- ich hab natürlich überflüssige Felder in den Tabellen gelöscht
- und andere Felder auf ihre Typen geprüft und VARCHAR-Felder ggf. gekürzt. Text-Felder gibt es keine.
- ich habe den Tabellen-Typ von MyISAM auf InnoDB geändert, und wieder rückgängig gemacht
- ich habe folgende Parameter in der my.ini geändert:
- query_cache_size=1000000
- key_buffer_size=350M
- innodb_buffer_pool_size=150M
- log_slow_queries = c:/xampp/slowqueries.log
- log-queries-not-using-indexes = c:/xampp/slowqueries.log
- in den betroffenen Tabellen habe ich Indizies hinzugefügt. Wenn ich allerdings EXPLAIN ausführe wird mir angezeigt dass für die Tabellen tabAuftrag, tabLieferschein2 und tabRechnung keine Indizies verwendet, und das sind gerade die Tabellen mit Inhalt (jeweils ca 10000 Datensätze).

Hier wenigstens einmal eine übersicht über die Indizies von tabAuftrag (nicht hübsch, aber selten):

Aktion Name Typ Unique Gepackt Feld Kardinalität Kollation Null Kommentar
PRIMARY BTREE Ja Nein Auftragsnr 10066 A
Auftragsnr BTREE Nein Nein Auftragsnr 10066 A
Auftragssorte 10066 A
Adminnr 10066 A
Kundennr 10066 A YES
LALand 10066 A YES
indexan 10066 A YES

Es ist eine Kopie von phpMyAdmin. Ich hoffe man kann das wesentliche erkennen.

Ich vermute (als blutiger Laie wa MySQL angeht) dass es im wesentlichen an den Indizies hängt. Verstehe nicht weshalb er hier für die Tabelle tabAuftrag keinen Index verwendet. Den Index mit dem Namen "Auftragsnr" habe ich auch erst im laufe der Tests zugefügt. Es hat leider keine Rolle gespielt..

Hat bitte jemand einen Rat für mich?

Gruß und schönes Wochenende!
Stefan
Mit Zitat antworten
  #2  
Alt 01.04.2011, 20:19:54
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: extrem langsame Abfrage..

Hallo Stefan,

Zitat:
Zitat von Daktari Beitrag anzeigen
- ich habe folgende Parameter in der my.ini geändert:
- query_cache_size=1000000
- key_buffer_size=350M
- innodb_buffer_pool_size=150M
- log_slow_queries = c:/xampp/slowqueries.log
- log-queries-not-using-indexes = c:/xampp/slowqueries.log
Die query_cache_size ist mit 1000000 zu klein. Entweder auf ca. 50-80 MB setzen oder auf 0 .

Wieviel RAM steht der Maschine zur Verfügung?
Benutzt Du MyISAM und InnoDB oder nur eines von beiden?

Zitat:
Zitat von Daktari Beitrag anzeigen
- ich habe folgende Parameter in der my.ini geändert:
- query_cache_size=1000000
- key_buffer_size=350M
- innodb_buffer_pool_size=150M
- log_slow_queries = c:/xampp/slowqueries.log
- log-queries-not-using-indexes = c:/xampp/slowqueries.log
- in den betroffenen Tabellen habe ich Indizies hinzugefügt. Wenn ich allerdings EXPLAIN ausführe wird mir angezeigt dass für die Tabellen tabAuftrag, tabLieferschein2 und tabRechnung keine Indizies verwendet, und das sind gerade die Tabellen mit Inhalt (jeweils ca 10000 Datensätze).
Kannst Du mal den EXPLAIN posten, bitte so formatieren, sonst ist er sehr schwer zu lesen.

Beispiel
Code:
mysql> explain select * from test;
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
| id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
|  1 | SIMPLE      | test  | ALL  | NULL          | NULL | NULL    | NULL |    4 |       |
+----+-------------+-------+------+---------------+------+---------+------+------+-------+
1 row in set (0.00 sec)
Soweit für's erste..

EDIT - Die SQL-Abfrage hat hier einen Syntaxfehler...
Code:
...
FROM          tabLaendercode RIGHT OUTER JOIN
                       tabAuftrag ON  tabLaendercode.Land =  tabAuftrag.LALand LEFT OUTER JOIN
                       tabAngebot LEFT OUTER JOIN
...

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.

Geändert von thomas_w (01.04.2011 um 20:28:30 Uhr) Grund: EDIT
Mit Zitat antworten
  #3  
Alt 01.04.2011, 21:35:12
Daktari Daktari ist offline
Anfänger
 
Registriert seit: Apr 2011
Alter: 51
Beiträge: 49
AW: extrem langsame Abfrage..

omg... ich hab das explain jetzt händisch iwie hingebogen...

ich hab in der zwischenzeit die obige select-anweisung als view "abauftrag" auf dem server abgelegt das explain sieht jetzt so aus:

Code:
mysql> explain select * from abfauftrag;
+----+-------------+-------------------------------+---------+------------------------------------+---------------+---------+------------------------------------------------------+-----------+-------+
| id | select_type | table                             | type      | possible_keys                          | key              | key_len  | ref                                                                     | rows       | Extra |
+----+-------------+-------------------------------+---------+------------------------------------+---------------+---------+------------------------------------------------------+-----------+-------+
|  1 | PRIMARY    | <derived2>                        | system  | NULL                                 | NULL           | NULL    | NULL                                                               |    1          |       |
+----+-------------+-------------------------------+---------+------------------------------------+---------------+---------+------------------------------------------------------+-----------+-------+
|  2 | DERIVED   | tabauftrag                        | ALL     | NULL                                 | NULL          | NULL    | NULL                                                               |    10066 |   using temporary;using filesort    | 
+----+-------------+-------------------------------+---------+------------------------------------+---------------+---------+------------------------------------------------------+-----------+-------+
|  2 | DERIVED   | tablaendercode                 | eq_ref  | PRIMARY                               | PRIMARY | 152         | func                                                                  |    1         |       |
+----+-------------+-------------------------------+---------+------------------------------------+---------------+---------+------------------------------------------------------+-----------+-------+
|  2 | DERIVED   | tabangebot                        | eq_ref  | PRIMARY                               | PRIMARY | 4             | ahockcrm.tabauftrag.indexan                          |    1          |       |
+----+-------------+-------------------------------+---------+------------------------------------+---------------+---------+------------------------------------------------------+-----------+-------+
|  2 | DERIVED   | tabadmin_1                       | eq_ref  | PRIMARY                               | PRIMARY | 4             | ahockcrm.tabangebot.adminnr                        |    1          |       |
+----+-------------+-------------------------------+---------+------------------------------------+---------------+---------+------------------------------------------------------+-----------+-------+
|  2 | DERIVED   | tablieferschein2                | ALL   | NULL                                  | NULL         | NULL    | NULL                                                              |    9409    |       |
+----+-------------+-------------------------------+---------+------------------------------------+---------------+---------+------------------------------------------------------+-----------+-------+
|  2 | DERIVED   | tabrechnung                      | ALL     | NULL                                  | NULL         | NULL    | NULL                                                              |    9335     |       |
+----+-------------+-------------------------------+---------+------------------------------------+---------------+---------+------------------------------------------------------+-----------+-------+
|  2 | DERIVED   | tabadmin_2                       | eq_ref  | PRIMARY                               | PRIMARY | 4            | ahockcrm.tabauftrag.adminnr                          |    1          |    using index   |
+----+-------------+-------------------------------+---------+------------------------------------+---------------+---------+------------------------------------------------------+-----------+-------+
|  2 | DERIVED   | tabauftragssorte                | eq_ref  | PRIMARY                               | PRIMARY | 4           | ahockcrm.tabauftrag.auftragsorte                      |   1          |       |
+----+-------------+-------------------------------+---------+------------------------------------+---------------+---------+------------------------------------------------------+-----------+-------+
|  2 | DERIVED   | tabadressen                       | eq_ref  | PRIMARY, Kundennummer        | PRIMARY |      4            | ahockcrm.tabauftrag.kundennr                              |    1         |       |
+----+-------------+-------------------------------+---------+------------------------------------+---------------+---------+------------------------------------------------------+-----------+-------+
|  2 | DERIVED   | tabland                            | eq_ref  | PRIMARY, Landnr                  | PRIMARY | 4            | ahockcrm.tabadressen.sprache                         |    1          |       |
+----+-------------+-------------------------------+---------+------------------------------------+---------------+---------+------------------------------------------------------+-----------+-------+
|  2 | DERIVED   | tabzahlungsbedingungen        | eq_ref  | PRIMARY                              | PRIMARY |  4              | ahockcrm.tabadressen.zahlungsbedingungen |    1         |       |
+----+-------------+-------------------------------+---------+------------------------------------+---------------+---------+------------------------------------------------------+-----------+-------+
ich habe alle tabellen als MyISAM definiert.
mein xp-notebook hat 2gb arbeitsspeicher. meinst du das?
die query_cache_size hab ich auf 80M angepasst.

das mit dem syntax-fehler versteh ich noch nicht ganz. ich habe die anweisung wie gesagt 1:1 vom sql-server übernommen. wonach muss ich schauen?

gibt es für diese abfragen wie explain noch eine andere möglichkeit als den query-browser oder phpmyadmin? von dort kann ich das ergebnis nicht ohne weiteres kopieren. ich hoffe ich habe in der übersicht oben keine fehler drin die zu verwirrungen führen könnten..


Danke in jedem Fall schon mal für Deine spontane Unterstützung!

Gruß
Stefan
Mit Zitat antworten
  #4  
Alt 01.04.2011, 21:49:48
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: extrem langsame Abfrage..

Okay, der EXPLAIN ist so einigermassen lesbar.

Laut EXPLAIN kann MySQL bei drei Tabellen nicht über einen Index zugreifen.
  • tabauftrag
  • tablieferschein2
  • tabrechnung

Bei dem SQL fehlt an der genannten Stelle ein ON, eventuell löst MySQL dies intern mit einem NATURAL JOIN oder es gibt ein Kartesisches Produkt.

Wenn Du mit den Index nicht klar kommt brauche ich zu den drei Tabellen oben die Tabellenstruktur mit..

Code:
mysql>SHOW CREATE TABLE tabauftrag;
mysql>SHOW CREATE TABLE tablieferschein2;
mysql>SHOW CREATE TABLE tabrechnung;
Allgemein sind VIEWs in MySQL nicht so performant wie der original SQL.

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #5  
Alt 01.04.2011, 21:52:39
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: extrem langsame Abfrage..

Wenn Du kein InnoDB verwendest, kann Du den Speicher freigeben.
Code:
innodb_buffer_pool_size=150M
auf
Code:
innodb_buffer_pool_size=8M
setzen. Eine ReStart der MySQL nicht vergessen.

Du kannst auch die MySQL Console für die SQL Abfragen und EXPLAIN verwenden.


Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #6  
Alt 01.04.2011, 22:20:13
Daktari Daktari ist offline
Anfänger
 
Registriert seit: Apr 2011
Alter: 51
Beiträge: 49
AW: extrem langsame Abfrage..

Die MySQL Console? Diese Eingabeaufforderung mit "mysql>" die beim 5.1er mit installiert wurde? Ich denk ich muss mich da erst mal kurz in die Handhabung einlesen..

Gruß
Stefan
Mit Zitat antworten
  #7  
Alt 01.04.2011, 22:37:39
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: extrem langsame Abfrage..

Zitat:
Zitat von Daktari Beitrag anzeigen
Die MySQL Console? Diese Eingabeaufforderung mit "mysql>" die beim 5.1er mit installiert wurde? Ich denk ich muss mich da erst mal kurz in die Handhabung einlesen..
genau einfach mit einer DOS-Box in das Verzeichnis

Code:
..\MySQL..\bin>
wechseln und dort

Code:
..\MySQL..\bin>mysql -u root -p datenbankname
eingeben. Dann kommt die Frage nach dem Passwort und dann der

mysql>

Prompt.

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #8  
Alt 03.04.2011, 17:05:20
Daktari Daktari ist offline
Anfänger
 
Registriert seit: Apr 2011
Alter: 51
Beiträge: 49
AW: extrem langsame Abfrage..

In der Console bekomm ich die Tabellenstruktur nicht so toll formatiert angezeigt.. Zuerst hab ich ca. 15 Zeilen mit den "-"-Formatierungszeichen, dann kommen genau so viele Leerzeilen, dann wieder so viele "-"-Zeilen, danach die Tabellenstruktur, und zum Schluß wieder ewig viel "-"-Zeilen. Da trau ich mir nicht mal zu das vernünftig händisch zu übernehmen, da hau ich bestimmt nur fehler rein... "copy and paste" geht dort auch nicht.
Ich habs auch mal in phpmyadmin versucht. Aber dort bekomm ich nur einen kurzen Anfang der Ausgabe angezeigt, gefolgt von "...."

Ist es tatsächlich nicht so einfach, oder stell ich mich nur an wie der letzte Mensch? :-(

Im Query-Browser wurde die Ausgabe nicht richtig formatiert. Wenn es nicht übersichtlich ist will ich aber gern noch versuchen es etwas zu formatieren..:

Code:
CREATE TABLE `tabauftrag` (
  `Auftragsnr` int(10) NOT NULL AUTO_INCREMENT,
  `AufDat` varchar(2) CHARACTER SET utf8 NOT NULL,
  `Location` varchar(5) CHARACTER SET utf8 NOT NULL,
  `EDatum` datetime NOT NULL,
  `Kommentar` varchar(255) COLLATE latin1_german2_ci DEFAULT '',
  `Auftragssorte` int(10) NOT NULL DEFAULT '1',
  `Adminnr` int(10) NOT NULL DEFAULT '13',
  `Zahlungsbednr` int(10) NOT NULL,
  `Kundennr` int(10) DEFAULT NULL,
  `Ansprechpartnernr` int(10) NOT NULL,
  `Kundenref` varchar(60) CHARACTER SET utf8 DEFAULT NULL,
  `Endkundennr` varchar(10) COLLATE latin1_german2_ci NOT NULL,
  `Endkundenref` varchar(60) COLLATE latin1_german2_ci DEFAULT NULL,
  `Lieferbed` varchar(60) COLLATE latin1_german2_ci NOT NULL,
  `Angebotsnr` varchar(15) COLLATE latin1_german2_ci DEFAULT NULL,
  `AufMwst` tinyint(4) NOT NULL DEFAULT '1',
  `LAFirma1` varchar(65) COLLATE latin1_german2_ci DEFAULT NULL,
  `LAFirma2` varchar(65) COLLATE latin1_german2_ci DEFAULT NULL,
  `LAStrasse` varchar(60) COLLATE latin1_german2_ci DEFAULT NULL,
  `LAPLZ` varchar(15) COLLATE latin1_german2_ci NOT NULL,
  `LAStadt` varchar(40) COLLATE latin1_german2_ci NOT NULL,
  `LALand` varchar(50) COLLATE latin1_german2_ci DEFAULT NULL,
  `LDatum` datetime DEFAULT NULL,
  `VersicherungProzent` double DEFAULT NULL,
  `VerpackungProzent` double DEFAULT NULL,
  `AP` varchar(40) COLLATE latin1_german2_ci DEFAULT NULL,
  `KuBestellnr` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
  `indexan` int(10) DEFAULT NULL,
  PRIMARY KEY (`Auftragsnr`),
  KEY `Auftragsnr` (`Auftragsnr`,`Auftragssorte`,`Adminnr`,`Kundennr`,`LALand`,`indexan`)
) ENGINE=MyISAM AUTO_INCREMENT=10117 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci
Code:
CREATE TABLE `tabrechnung` (
  `Rechnungsnr` int(10) NOT NULL AUTO_INCREMENT,
  `MarkierungTxt` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
  `ReBrutto` double NOT NULL DEFAULT '0',
  `bezBetrag` double DEFAULT '0',
  `bezDatum` datetime DEFAULT NULL,
  `Kundennr` int(10) DEFAULT NULL,
  `Datum` datetime DEFAULT NULL,
  `AdminnrR` int(10) NOT NULL DEFAULT '13',
  `RechMwst` double DEFAULT NULL,
  `gedruckt` tinyint(4) NOT NULL DEFAULT '0',
  `ArtikelSumNet` double DEFAULT NULL,
  `Verpackung` double DEFAULT '0',
  `VerpackungProzentR` double DEFAULT '0',
  `Versicherung` double DEFAULT '0',
  `VersicherungProzentR` double DEFAULT '0',
  `TNTFracht` double NOT NULL DEFAULT '0',
  `Kommentar` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `proforma` int(10) NOT NULL DEFAULT '0',
  `UstIDNr` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
  `AuftragsnrR` int(10) NOT NULL DEFAULT '0',
  `Endkundennr` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
  `Rechnungsad` varchar(255) CHARACTER SET utf8 NOT NULL,
  `Teillieferung` int(10) NOT NULL DEFAULT '0',
  `Lieferbed` varchar(50) CHARACTER SET utf8 NOT NULL,
  `RechnungsnrPRo` int(10) NOT NULL DEFAULT '0',
  `AufDatR` varchar(2) CHARACTER SET utf8 NOT NULL,
  `ReDat` varchar(2) CHARACTER SET utf8 DEFAULT NULL,
  `RSatz` varchar(150) CHARACTER SET utf8 DEFAULT NULL,
  `Teilrechnung` int(10) NOT NULL DEFAULT '0',
  `RLSNr` varchar(100) CHARACTER SET utf8 DEFAULT NULL,
  `RLSDatum` varchar(100) CHARACTER SET utf8 DEFAULT NULL,
  `RAufdatL` char(2) COLLATE latin1_german2_ci DEFAULT NULL,
  `Lieferad` varchar(255) CHARACTER SET utf8 NOT NULL,
  `Rev` int(10) NOT NULL DEFAULT '0',
  `Lieferscheinnr` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `KuBestellnrR` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
  `Zahlungsziel` int(10) DEFAULT NULL,
  `MahnungAktiv` tinyint(4) DEFAULT '0',
  `MahnungDate` datetime DEFAULT NULL,
  `Mahnstufe` varchar(50) CHARACTER SET utf8 NOT NULL DEFAULT 'Rechnung',
  `Mahnungstext` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `TageZahlung` int(10) DEFAULT NULL,
  `neueRechnungsnr` int(10) DEFAULT NULL,
  `alteRechnungsnr` int(10) DEFAULT NULL,
  PRIMARY KEY (`Rechnungsnr`),
  KEY `Rechnungsnr` (`Rechnungsnr`,`AuftragsnrR`)
) ENGINE=MyISAM AUTO_INCREMENT=11381 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci
Code:
CREATE TABLE `tablieferschein2` (
  `Lieferscheinnr` int(10) NOT NULL,
  `LSVer` int(10) DEFAULT NULL,
  `IndexL` int(10) NOT NULL AUTO_INCREMENT,
  `Auftragsnr` int(10) DEFAULT NULL,
  `Datum` datetime DEFAULT NULL,
  `Verpackung` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `Gewicht` double DEFAULT NULL,
  `Lieferbed` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `Kommentar` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `Lieferad` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `Endkundennr` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `Adminnr` int(10) DEFAULT '13',
  `Teillieferung` int(10) DEFAULT NULL,
  `Rechnungsad` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `Grund` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  `Rechnung` tinyint(4) NOT NULL,
  `AufdatL` char(2) COLLATE latin1_german2_ci DEFAULT NULL,
  `KuBestellnrL` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
  PRIMARY KEY (`IndexL`),
  KEY `Lieferscheinnr` (`Lieferscheinnr`,`IndexL`,`Auftragsnr`)
) ENGINE=MyISAM AUTO_INCREMENT=9461 DEFAULT CHARSET=latin1 COLLATE=latin1_german2_ci
Mein laienhaftes Auge konnt da jetzt gar nix verdächtiges erkennen.. :-(
Fällt Dir etwas auf?

Gruß
Stefan
Mit Zitat antworten
  #9  
Alt 03.04.2011, 17:39:09
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: extrem langsame Abfrage..

Ich habe die SQL-Abfrage etwas umformatiert, die Reihenfolge der ON Befehle war leicht durcheinander. Interessant, dass dies trotzdem funktioniert.

Code:
SELECT tabauftrag.auftragsnr,
       tabauftrag.aufdat,
       tabauftrag.edatum,
       tabauftrag.location,
       tabauftrag.kommentar,
       tabauftrag.auftragssorte,
       tabauftrag.adminnr,
       tabauftrag.aufmwst,
       tabauftrag.zahlungsbednr,
       tabauftrag.kundennr,
       tabauftrag.endkundennr,
       tabauftrag.endkundenref,
       tabauftrag.lieferbed,
       tabauftrag.angebotsnr,
       tabauftrag.ansprechpartnernr,
       tabauftrag.lafirma1,
       tabauftrag.lafirma2,
       tabauftrag.lastrasse,
       tabauftrag.laplz,
       tabauftrag.lastadt,
       tabauftrag.laland,
       tabzahlungsbedingung.zahlungsbed,
       tabadressen.kommentar              AS kundenkommentar,
       tabadressen.zahlungsbedingungen,
       tabadressen.laendercode,
       tabadressen.rland,
       tabadressen.rstadt,
       tabadressen.rfirma1,
       tabadressen.sprache,
       tabadressen.rfirma2,
       tabadressen.rstrasse,
       tabadressen.rplz,
       tabadressen.kundennummer,
       tabadressen.gesperrt,
       tabadressen.mwst,
       tabadressen.rsonstiges,
       tabland.landsprache,
       tabauftragssorte.artkurz,
       tabauftragssorte.art,
       tabadmin_1.kuerzel,
       tabauftrag.ldatum,
       tabauftrag.versicherungprozent,
       tabauftrag.verpackungprozent,
       tabauftrag.ap,
       tabadressen.rtelefon,
       tabadressen.rfax,
       tabadmin_1.adminnr                 AS adminnra,
       tabauftragssorte.nr,
       tabland.landnr,
       tabzahlungsbedingung.zahlungsbednr AS znr,
       tabrechnung.rechnungsnr,
       tabrechnung.datum                  AS datumr,
       tabauftrag.kubestellnr,
       tablieferschein2.lieferscheinnr,
       tablieferschein2.datum             AS datuml,
       tablieferschein2.indexl,
       tablieferschein2.lsver,
       tabadressen.quotientzziel,
       tabadressen.vorkasse,
       tabadressen.lieferantennummer,
       tabadressen.rustidnr,
       tabangebot.aufdatan,
       tabauftrag.indexan,
       tabadmin_1.kuerzel                 AS ank,
       tabangebot.ver,
       tabangebot.angebotsnr              AS angebnr,
       tablaendercode.zollhinweis,
       tabauftrag.kundenref
FROM   tablaendercode
       RIGHT OUTER JOIN tabauftrag
         ON tablaendercode.land = tabauftrag.laland
       LEFT OUTER JOIN tabangebot
         ON tabauftrag.indexan = tabangebot.indexan
       LEFT OUTER JOIN tabadmin AS tabadmin_1
         ON tabangebot.adminnr = tabadmin_1.adminnr
       LEFT OUTER JOIN tablieferschein2
         ON tabauftrag.auftragsnr = tablieferschein2.auftragsnr
       LEFT OUTER JOIN tabrechnung
         ON tabauftrag.auftragsnr = tabrechnung.auftragsnrr
       LEFT OUTER JOIN tabadmin AS tabadmin_2
         ON tabauftrag.adminnr = tabadmin_2.adminnr
       LEFT OUTER JOIN tabauftragssorte
         ON tabauftrag.auftragssorte = tabauftragssorte.nr
       LEFT OUTER JOIN tabadressen
         ON tabauftrag.kundennr = tabadressen.kundennummer       
       LEFT OUTER JOIN tabzahlungsbedingung
         ON tabadressen.zahlungsbedingungen = tabzahlungsbedingung.zahlungsbednr
       LEFT OUTER JOIN tabland
         ON tabadressen.sprache = tabland.landnr
ORDER  BY tabauftrag.auftragsnr DESC;
folgende zwei Änderung an den Indices würde ich empfehlen.

Code:
ALTER TABLE tabrechnung
 DROP KEY `Rechnungsnr`, 
 ADD KEY `auftrag_rechnungsnr` (`AuftragsnrR`,`Rechnungsnr`);

ALTER TABLE tablieferschein2
 ADD KEY auf_lief_index (`Auftragsnr`,`Lieferscheinnr`,`IndexL`);
So, jetzt nochmal testen und den EXPLAIN SELECT .. ausführen. Der EXPLAIN läßt sich gut in der MySQL Console ausführen. Die Ausgabe ist dann bereits perfekt formatiert.

Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
Mit Zitat antworten
  #10  
Alt 03.04.2011, 18:09:56
Daktari Daktari ist offline
Anfänger
 
Registriert seit: Apr 2011
Alter: 51
Beiträge: 49
AW: extrem langsame Abfrage..

Die Abfrage hatte ich vom MSSQL-Server kopiert. Da sie letztendlich funktioniert hat dachte ich das Problem wären vor allem die Indizies.
Ging es bei den neu angelegten Indizies vor allem darum die "Auftragsnr" nach ganz vorne zu setzen? Dann würde ich solche Indizies wohl in Zukunft auch besser zu Fuß denn mit dem phpmyadmin anlegen. Dort ist die Reihenfolge meine ich nicht beeinflussbar.
Bei den nächsten Abfragen die ich vom MSSQL übernehme werde ich mir auf jeden Fall die ON Befehle genau anschauen wenn ich Performance-Probleme habe!
Im Explain sieht alles soweit gut aus, nur die tabAuftrag wird hier ohne Key angezeigt. Ist das bei der "Haupttabelle" richtig so? Bei den Tabellen Lieferschein und Rechnung werden mir die neu erstellten Indizies angezeigt, jeweils mit der "ref" Auftragsnr!
Die Explain-Ausgabe hab ich hier nicht gepostet weil die Abfrage auf einmal anstatt der über 1500s jetzt nur noch 0,04s braucht! Ich hab gerade eben auch noch einmal die Abfrage vom MSSQL ausprobiert, und festgestellt dass diese jetzt auch so schnell ist! Scheinbar lag das Problem tatsächlich an den Indizies!?

Vielen Dank für Deine Hilfe!!!
Gruß
Stefan
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
Ergebnisse aus MySQL Abfrage, obwohl Abfrage eigentlich leer mauritius MySQLi/PDO/(MySQL) 1 15.09.2010 16:16:30
Doppelte Abfrage in einem SELECT Mark Knochen MySQLi/PDO/(MySQL) 9 02.09.2010 21:30:07
Wie SELECT mit Suche nach String beschleunigen? mgutt MySQLi/PDO/(MySQL) 11 23.10.2008 18:36:17
"Illegal mix of collations" bei Abfrage über View - nur auf dem Server!! masseschaden MySQLi/PDO/(MySQL) 2 14.09.2008 21:45:33
MySQL Abfrage innerhalb einer Abfrage HariboGold MySQLi/PDO/(MySQL) 4 27.08.2008 18:00:28


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:36:15 Uhr.


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


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