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

Das Zend Framework

Das Zend Framework 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)
Hilfe Community Kalender Heutige Beiträge Suchen

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 17.06.2009, 15:43:26
nivadis nivadis ist offline
Anfänger
 
Registriert seit: Jun 2009
Alter: 34
Beiträge: 6
SQL Query optimierung / beschleunigung

Hallo,

habe folgende query mit subselects und joins, etc.

die abfrage dauert über 20 Sekunden .. was mich sehr nervt ... jedoch finde ich im Internet kein vernünftigen query optimizer / analyzer .. vielleicht könnt ihr mir helfen...

(Handelt sich um eine art Volltextsuche in mehreren Tabellen)
Die Datenbank Struktur ist im Datei-Anhang.
folgende query:

Code:
 SELECT COUNT( p.id )
FROM produkte AS p
LEFT JOIN hersteller AS h ON h.id = p.hersteller_id
LEFT JOIN produkte_history AS ph ON ph.produkte_id = p.id
LEFT JOIN produkte_has_files AS phfs ON phfs.produkte_id = p.id
LEFT JOIN files AS fs ON fs.id = phfs.files_id
LEFT JOIN kontakte AS k ON k.id = ph.an_id
WHERE (
p.name LIKE '%hp%'
OR h.name LIKE '%hp%'
OR p.typenbezeichnung LIKE '%hp%'
OR ph.rechnungsnummer LIKE '%hp%'
OR p.seriennummer LIKE '%hp%'
OR p.serialnummer LIKE '%hp%'
OR p.sntext LIKE '%hp%'
OR p.dmmd_nummer LIKE '%hp%'
OR p.dmmd_anummer LIKE '%hp%'
OR fs.orignname LIKE '%hp%'
OR fs.freitext LIKE '%hp%'
OR p.freitext LIKE '%hp%'
OR (
k.firma1 LIKE '%hp%'
OR k.spitzname LIKE '%hp%'
AND ph.erstellt_datum = (
SELECT max( ph.erstellt_datum )
FROM produkte_history AS ph
WHERE ph.produkte_id = p.id
AND ph.an_id = k.id )
)
OR p.id IS NULL
)
AND k.id = (
SELECT DISTINCT an_id
FROM produkte_history
WHERE erstellt_datum = (
SELECT max( erstellt_datum )
FROM produkte_history
WHERE produkte_id = p.id )
GROUP BY erstellt_datum )
GROUP BY p.id
ORDER BY p.erstellt_datum DESC
die Indizes sind alle auf die PKs und FKs gesetzt.

ich weiß einfach nicht mehr weiter!

danke schon mal im voraus!

lg nivadis

Geändert von nivadis (19.06.2009 um 15:45:35 Uhr)
Mit Zitat antworten
  #2  
Alt 18.06.2009, 10:23:53
nivadis nivadis ist offline
Anfänger
 
Registriert seit: Jun 2009
Alter: 34
Beiträge: 6
AW: SQL Query optimierung / beschleunigung

ok die query braucht bei mehr datensätzen gleich schon 141 Sekunden

Hier die Mess Analyse von PHPMyAdmin
Messen
Status Dauer
(initialization) 1.2755227
Opening tables 0.8946887
System lock 0.0747440
Table lock 0.0530915
init 0.0412365
optimizing 0.0000212
statistics 0.1404672
preparing 0.1260762
executing 0.2320507
Sending data 0.000998
end 0.0000167
query end 0.000013
freeing items 0.0063272
closing tables 0.0000147
removing tmp table 0.0001287
closing tables 0.0000107
logging slow query 0.000006

Zeige Datensätze 0 - 29 (50 insgesamt, die Abfrage dauerte 141.0148 sek.)


was genau bedeuten die oberen beiden punkte... kann man dort was optimieren?

(initialization) 1.2755227
Opening tables 0.8946887

danke. lg nivadis
Mit Zitat antworten
  #3  
Alt 18.06.2009, 11:05:11
cortex cortex ist offline
SELFPHP Profi
 
Registriert seit: Apr 2008
Alter: 48
Beiträge: 1.938
AW: SQL Query optimierung / beschleunigung

bin sicher nicht der db-guru... was mir auffällt:

- sehr viele joins
- sehr viele LIKE mit vorangestellten platzhalter |1
- sehr viele subselects

|1 bei der suche via %LIKE kann kein index genutzt werden; ein nachgestellter platzhalter (LIKE%) ist unproblematisch.

values innerhalb einer WHERE-condition zu indizieren, ist das A und O einer effizienten db-abfrage. ich würde für den ersten moment vorschlagen:

- auf die vorangestellten platzhalter verzichten
- alle spalten, die in den WHERE-conditions auftauchen, indizieren

cx

Geändert von cortex (18.06.2009 um 11:05:51 Uhr)
Mit Zitat antworten
  #4  
Alt 18.06.2009, 13:00:10
nivadis nivadis ist offline
Anfänger
 
Registriert seit: Jun 2009
Alter: 34
Beiträge: 6
AW: SQL Query optimierung / beschleunigung

Hmm dann die frage, wenn das alles sehr viele sind .. wie kann man das ganze realisieren mit weniger ...

gut das Problem ist es soll eine Volltextsuche werden und somit ist der Platzhalter sehr relevant.

da auch Buchstabenkombinationen in mitten eines Datenbankfeldes gefunden werden soll.

die Indizierung habe ich schon durchgeführt ... jedoch ohne merkbaren erfolg ...

oder eine andere Idee meinerseits:

würde die Verwendung der "Volltextsuche" in mysql das Statement beschleunigen?

meine Idee wäre wie folgt: (jedoch gibts dabei immer den Fehler #1210: Incorrect arguments to MATCH) vielleicht habe ich die Syntax der Funktion nicht ganz verstanden aber irgendwie bekomme ich das so auch nicht ans laufen.

Code:
SELECT * FROM 
produkte AS p 
INNER JOIN hersteller AS h ON h.id=p.hersteller_id 
INNER JOIN produkte_history AS ph ON ph.produkte_id=p.id 
INNER JOIN produkte_has_files AS phfs ON phfs.produkte_id=p.id 
INNER JOIN files AS fs ON fs.id=phfs.files_id 
INNER JOIN kontakte AS k ON k.id=ph.an_id 



WHERE MATCH (p.name,h.name,p.typenbezeichnung,ph.rechnungsnummer,p.seriennummer,p.serialnummer,p.sntext,p.dmmd_nummer,p.dmmd_anummer,fs.orignname,fs.freitext,p.freitext) AGAINST ('%hp%')
OR 
	( k.firma1 like '%hp%' 
	OR k.spitzname like '%hp%' 
		AND ph.erstellt_datum = 
			( SELECT max( ph.erstellt_datum ) 
			FROM produkte_history AS ph 
			WHERE ph.produkte_id = p.id 
			AND ph.an_id = k.id
			) 
	) 
AND k.id = ( 
SELECT DISTINCT an_id FROM produkte_history WHERE erstellt_datum = (
SELECT max(erstellt_datum) FROM produkte_history WHERE produkte_id = p.id) 
GROUP BY erstellt_datum )
GROUP BY p.id 
ORDER BY p.erstellt_datum DESC 
LIMIT 0,50
Mit Zitat antworten
  #5  
Alt 18.06.2009, 14:26:33
cortex cortex ist offline
SELFPHP Profi
 
Registriert seit: Apr 2008
Alter: 48
Beiträge: 1.938
AW: SQL Query optimierung / beschleunigung

Zitat:
Zitat von nivadis Beitrag anzeigen
wie kann man das ganze realisieren mit weniger
k.a. - dazu kann ich dir keine konkreten hinweise geben.

Zitat:
Zitat von nivadis Beitrag anzeigen
das Problem ist es soll eine Volltextsuche werden und somit ist der Platzhalter sehr relevant.
dann musst du in kauf nehmen, dass der db-index nicht benutzt wird. ganz im gegenteil: wenn die tabelle des öfteren geändert wird, wird sich das neuschreiben des index als zusätzlicher flaschenhals bemerkbar machen.

Zitat:
Zitat von nivadis Beitrag anzeigen
die Indizierung habe ich schon durchgeführt ... jedoch ohne merkbaren erfolg ...
dazu sagte ich bereits:

Zitat:
Zitat von cortex Beitrag anzeigen
bei der suche via %LIKE kann kein index genutzt werden; ein nachgestellter platzhalter (LIKE%) ist unproblematisch.
Zitat:
Zitat von nivadis Beitrag anzeigen
würde die Verwendung der "Volltextsuche" in mysql das Statement beschleunigen?
du dokterst lediglich an den symptomen herum. je unschärfer deine WHERE-bedingung, desto aufwändiger die abfrage. was du da vorhast, bringt das dbms gehörig ins schwitzen. nochmal mein hinweis:

Zitat:
Zitat von cortex Beitrag anzeigen
values innerhalb einer WHERE-condition zu indizieren, ist das A und O einer effizienten db-abfrage.
Zitat:
Zitat von nivadis Beitrag anzeigen
Incorrect arguments to MATCH
die syntax lautet folgendermaszen:

PHP-Code:
                        WHERE                
                            
( var = 'value' )
                            AND 
MATCH                
                                
something1something2something3 
                                
AGAINST                
                                    
'anything' 
das WHERE ( var = 'value' ) ist natürlich nicht obligatorisch...

cx
Mit Zitat antworten
  #6  
Alt 18.06.2009, 14:58:01
nivadis nivadis ist offline
Anfänger
 
Registriert seit: Jun 2009
Alter: 34
Beiträge: 6
AW: SQL Query optimierung / beschleunigung

Zitat:
values innerhalb einer WHERE-condition zu indizieren, ist das A und O einer effizienten db-abfrage.
aber grad nochmal zur verständnis frage: also alle felder die in der WHERE bedingung durchsucht werden sollten in der Datenbank als Indizes markiert werden?


danke.

lg nivadis
Mit Zitat antworten
  #7  
Alt 18.06.2009, 15:04:27
cortex cortex ist offline
SELFPHP Profi
 
Registriert seit: Apr 2008
Alter: 48
Beiträge: 1.938
AW: SQL Query optimierung / beschleunigung

Zitat:
Zitat von nivadis Beitrag anzeigen
also alle felder die in der WHERE bedingung durchsucht werden sollten in der Datenbank als Indizes markiert werden?
korrekt, und zwar so, wie sie notiert werden:

WHERE var_a = '$a' AND var_b = '$b' benötgt einen (gemeinsamen) index über var_a und var_b

schau dir mal das entsprechende kapitel im handbuch an: Wie MySQL Indizes benutzt

cx

Geändert von cortex (18.06.2009 um 15:04:45 Uhr)
Mit Zitat antworten
  #8  
Alt 19.06.2009, 11:10:50
nivadis nivadis ist offline
Anfänger
 
Registriert seit: Jun 2009
Alter: 34
Beiträge: 6
AW: SQL Query optimierung / beschleunigung

ja ok .. nur bei mir ist halt das Problem das ich eine abfrage über mehrere Tabellen mache und ich den Index doch nicht über mehrere Tabellen machen kann, oder?

ich hab einen FULLTEXT index über die entsprechenden Felder in den einzelnen Tabellen gemacht. ohne erfolg immmer folgende fehlermeldung:

#1191 - Can't find FULLTEXT index matching the column list



und das mit dem Platzhalter funktioniert wohl doch mit indizierung

Zitat:
If you use ... LIKE '%string%' and string is longer than three characters, MySQL uses the Turbo Boyer-Moore algorithm to initialize the pattern for the string and then uses this pattern to perform the search more quickly.
lg nivadis
Mit Zitat antworten
  #9  
Alt 19.06.2009, 11:26:54
DokuLeseHemmung DokuLeseHemmung ist offline
SELFPHP Experte
 
Registriert seit: Jun 2008
Alter: 15
Beiträge: 2.269
AW: SQL Query optimierung / beschleunigung

Am Rande:
Code:
EXPLAIN SELECT  ....dein.statement......
Explain kann dir zeigen wo es klemmt.
Es macht keinen Sinn an der falschen Stelle zu rumzudoktorn.
Mit Zitat antworten
  #10  
Alt 19.06.2009, 11:27:02
cortex cortex ist offline
SELFPHP Profi
 
Registriert seit: Apr 2008
Alter: 48
Beiträge: 1.938
AW: SQL Query optimierung / beschleunigung

Zitat:
Zitat von nivadis Beitrag anzeigen
[...] und ich den Index doch nicht über mehrere Tabellen machen kann, oder?
soweit ich weiss, ist das nicht möglich.

Zitat:
Zitat von nivadis Beitrag anzeigen
#1191 - Can't find FULLTEXT index matching the column list
falls das auf deine volltext-suche (MATCH... AGAINST...) zielt: man braucht einen FULLTEXT index, der alle such-spalten umfasst. falls sich nun deine such-spalten in mehreren unterschiedlichen tabellen befinden... sackgasse.

Zitat:
Zitat von nivadis Beitrag anzeigen
und das mit dem Platzhalter funktioniert wohl doch mit indizierung
LIKE 'var%' kann einen index nutzen; LIKE '%var' hingegen nicht.

cx
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

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
Sql Query + Summe aus Summe Moepmann MySQLi/PDO/(MySQL) 4 04.06.2009 10:56:32
SQL Query LordSax MySQLi/PDO/(MySQL) 1 16.09.2008 11:59:38
SQL Query oder Klasse? bweichel PHP für Fortgeschrittene und Experten 3 08.05.2007 16:39:47
To Many Connections ProGamer11 PHP Grundlagen 0 18.06.2003 23:52:56
SQL Query bereits bei der Abfrage sortieren Gladder PHP für Fortgeschrittene und Experten 1 19.09.2002 11:07:37


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:52:16 Uhr.


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


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