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
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
MySQLi/PDO/(MySQL) Anfänger, Fortgeschrittene oder Experten können hier Fragen und Probleme rund um MySQLi/PDO/(MySQL) diskutieren |
01.04.2011, 16:56:35
|
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
|
01.04.2011, 20:19:54
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: extrem langsame Abfrage..
Hallo Stefan,
Zitat:
Zitat von Daktari
- 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
- 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
|
01.04.2011, 21:35:12
|
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
|
01.04.2011, 21:49:48
|
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.
|
01.04.2011, 21:52:39
|
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.
|
01.04.2011, 22:20:13
|
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
|
01.04.2011, 22:37:39
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
|
|
AW: extrem langsame Abfrage..
Zitat:
Zitat von Daktari
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
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.
|
03.04.2011, 17:05:20
|
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
|
03.04.2011, 17:39:09
|
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.
|
03.04.2011, 18:09:56
|
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
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Themen-Optionen |
|
Ansicht |
Linear-Darstellung
|
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.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 12:36:15 Uhr.
|