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

Websites optimieren für Google & Co.

Websites optimieren für Google & Co. 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 31.05.2005, 09:36:49
leoo leoo ist offline
Anfänger
 
Registriert seit: May 2005
Beiträge: 3
Dubletten Prüfung dauert zu lange.

Hallo Leute!

Hab ein Problem bei der Dublettenprüfung. Habe es gemacht wie im Artikel unter: http://www.selfphp.com/forum/showthr...?threadid=8947 beschrieben. Leider dauert die Abfrage zu lange

Das Select Statement:
Code:
SELECT t1.kid AS id1, t2.kid AS id2 FROM k_data AS t1 INNER JOIN k_data AS t2 on t1.email = t2.email WHERE t1.kid < t2.kid
kid = Primary Key und Index gesetzt
email = Index gesetzt

Space Usage Tabelle: 10.447 KB
Tabelle: 51003 Datensätze

Hat von euch wer eine Idee was ich falsch mache oder gibt es eine gute Doku zur Dublettenprüfung? Bin für jede Hilfe dankbar.

Lg Stefan

Geändert von leoo (31.05.2005 um 10:55:02 Uhr)
Mit Zitat antworten
  #2  
Alt 31.05.2005, 10:41:43
diver-network diver-network ist offline
Junior Member
 
Registriert seit: Apr 2003
Ort: TÜ
Beiträge: 337
AW: Dubletten Prüfung dauert zu lange.

Hi Stefan,

leider hast Du meinen Tip nicht richtig durchgelesen.
Das
Zitat:
...WHERE t1.primary-key < t2.primary-key // WICHTIG, sonst Kreuzprodukt aus allen Inhalten und quasi Endlosschleife!
ist wirklich wichtig.
Füg' das mal entsprechend angepasst an Dein Statement an und schon sollte es bei richtig gesetzten Indizes in einer akzeptablen Zeit funktionieren.

Gruß,

Andy
Mit Zitat antworten
  #3  
Alt 31.05.2005, 10:57:32
leoo leoo ist offline
Anfänger
 
Registriert seit: May 2005
Beiträge: 3
AW: Dubletten Prüfung dauert zu lange.

Hi!

Ups hat irgendwie nicht alles kopiert hab es jetzt in mein Posting reingegeben habe die Abfrage mit den Primary-Key gemacht.

Code:
SELECT t1.kid AS id1, t2.kid AS id2 FROM k_data AS t1 INNER JOIN k_data AS t2 on t1.email = t2.email
WHERE t1.kid < t2.kid
lg stefan
Mit Zitat antworten
  #4  
Alt 31.05.2005, 11:23:37
diver-network diver-network ist offline
Junior Member
 
Registriert seit: Apr 2003
Ort: TÜ
Beiträge: 337
AW: Dubletten Prüfung dauert zu lange.

Hi Stefan,

da Deine Abfrage stimmt und ich mal davon ausgehe, daß die Indizes wirklich richtig gesetzt sind weiß ich auch nicht weiter.

Bei mir funktioniert die Abfrage normalerweise in weniger als einer Minute bei vergleichbaren Datenmengen. Wenn es länger dauert habe ich entweder die WHERE id1 < id2 Klausel vergessen oder keinen Index gesetzt.

Eventuell hilft es Dir, wenn Du vor dem SELECT noch ein EXPLAIN machst und da mal nachschaust, ob und wenn ja welche Indizes MySQL verwendet.

Ansonsten noch folgende Fragen bzw. Anregungen, warum es lange dauern kann:
- Was verstehst Du unter "zu lange"? 2 Minuten kann die Abfrage schon dauern, 10 Minute wäre aber wirklich zu langsam.
- Wieviele Doubletten gibt es schätzungsweise? (je mehr, je langsamer)
- Wieviele davon kommen mehr als 2mal vor? (je öfters, je langsamer)
- laufen noch andere Abfragen parallel oder ist Dein Statement das Einzige, daß dann die DB belastet? (am wichtigsten!)

Eine allgemeine Regel, wie man auf doppelte Datensätze prüfen kann bzw. soll kenne ich nicht, bin aber für bessere Mittel und Wege auch immer dankbar.

Gruß,

Andy
Mit Zitat antworten
  #5  
Alt 31.05.2005, 11:50:07
leoo leoo ist offline
Anfänger
 
Registriert seit: May 2005
Beiträge: 3
AW: Dubletten Prüfung dauert zu lange.

Hi!

Wenn ich ein EXPLAIN vorschicke kommt folgendes:

Link: http://www.leoo.at/explain1.pdf Stimmt da was nicht?

Zitat:
Was verstehst Du unter "zu lange"? 2 Minuten kann die Abfrage schon dauern, 10 Minute wäre aber wirklich zu langsam.
Nach 15 Minuten breche ich im phpMyAdmin ab

Zitat:
Wieviele Doubletten gibt es schätzungsweise? (je mehr, je langsamer)
ca. 200
Zitat:
Wieviele davon kommen mehr als 2mal vor? (je öfters, je langsamer)
ca. 10
Zitat:
laufen noch andere Abfragen parallel oder ist Dein Statement das Einzige, daß dann die DB belastet? (am wichtigsten!)
nein

lg stefan
Mit Zitat antworten
  #6  
Alt 31.05.2005, 13:23:51
diver-network diver-network ist offline
Junior Member
 
Registriert seit: Apr 2003
Ort: TÜ
Beiträge: 337
AW: Dubletten Prüfung dauert zu lange.

Hi Stefan,

soweit ich sehen kann ist Dein SELECT in Ordnung und der Output von EXPLAIN ist auch ok. Der Key t1.email wird verwendet, so daß Du kein Kreuzprodukt hast.
Dennoch muß MySQL ca. 150.000 (genauer: 51.003 * 3) rows (Zeilen, Datensätze) anpacken, um zum gewünschten Ergebnis zu kommen. Dies dauert natürlich eine Weile.

Da ich kein MySQL Profi bin bin ich jetzt auch am Ende meines Wissens angelangt und kann Dir nicht mehr weiter helfen. Hier hoffe ich, daß noch andere diesen Thread verfolgen und besser Bescheid wissen.

Die einzigen Mittel, die mir noch einfallen sind:
- Mache vorher ein OPTIMIZE TABLE k_data, um die Keys besser zu sortieren.
- Versuche, die mögliche Treffermenge zu reduzieren, z.B., indem Du zuerst als zusätzliche Einschränkung ... WHERE t1.kid < t2.kid AND t1.kid < 25000 und in einem zweiten Schritt ... AND t1.kid > 24999 (NICHT 25000, sonst fehlt das) bringst oder z.B. WHERE email LIKE "a%" zustäzlich bringst und das Ergebnis dann auf mehrere Male bekommst.

Wenn Du nur die doppelten Einträge eliminieren willst könntest Du auch eine zweite Tabelle anlegen und diese mit
Code:
SELECT DISTINCT(t1.kid, t1.email) FROM k_data AS t1 INTO k_data_temp
füllen. BEACHTE ABER, daß meine Syntax hier nicht stimmen muß, da "freihändig" geschrieben.

Wie geschrieben kann ich Dir momentan nicht mehr weiter helfen, werde aber heute abend (habe gerade kein MySQL zur Hand) ein paar Dinge versuchen und mich eventuell noch mal melden.

Gruß und viel Erfolg,

Andy
Mit Zitat antworten
  #7  
Alt 01.06.2005, 13:05:38
diver-network diver-network ist offline
Junior Member
 
Registriert seit: Apr 2003
Ort: TÜ
Beiträge: 337
AW: Dubletten Prüfung dauert zu lange.

Hi Stefan,

leider habe ich nichts besseres gefunden.
Ein
Code:
SELECT t1.kid, t1.email
  FROM k_data AS t1
 GROUP BY t1.email
HAVING COUNT(t1.email) > 1 // bzw. COUNT(*)
hat leider auch nicht das gebracht, was ich erhofft hatte.

Sorry,

Andy
Mit Zitat antworten
  #8  
Alt 16.06.2005, 10:17:44
diver-network diver-network ist offline
Junior Member
 
Registriert seit: Apr 2003
Ort: TÜ
Beiträge: 337
AW: Dubletten Prüfung dauert zu lange.

Hi zusammen,

zum finden von doppelten Einträgen in einer Tabelle hatte ich noch einmal eine Anfrage in der Newsgroup mailing.database.mysql gestartet ("Best way for finding duplicate entries in table?" vom 1.Juni 2005).
Anbei die von mir übersetzte Antwort DES MySQL Spezialisten (meine Meinung) der Newsgruppe, Bill Karwin.
Ihm gebührt der Dank für diese Lösung.

Liste der Einträge, die mehrfach in der Tabelle auftauchen.

SELECT t2.`field`
FROM `table` AS t2
GROUP BY t2.`field`
HAVING COUNT(t2.`field`) > 1;

Liste der IDs von Einträgen, die mehrfach in der Tabelle auftauchen.

SELECT t.id
FROM `table` AS t
WHERE t.`field` IN (
SELECT t2.`field`
FROM `table` AS t2
GROUP BY t2.`field`
HAVING COUNT(t2.`field`) > 1);

Liste der jeweils kleinesten ID von Einträgen, die in einer Tabelle vorkommen.

SELECT MIN(t3.id)
FROM `table` AS t3
GROUP BY t3.`field`;

Alles zusammen gesetzt sollte unten stehendes Statement alle Datensätze löschen,
die mehr als einmal in einer Tabelle vorkommen.
Hierbei wird der Eintrag mit der kleinsten ID nicht gelöscht.

DELETE FROM `table`
WHERE id IN (
SELECT t.id
FROM `table` AS t
WHERE t.`field` IN (
SELECT t2.`field`
FROM `table` AS t2
GROUP BY t2.`field`
HAVING COUNT(t2.`field`) > 1))
AND id NOT IN (
SELECT MIN(t3.id)
FROM `table` AS t3
GROUP BY t3.`field`);

Sollte der Eintrag mit der größten ID des Feldes stehen bleiben so ist das Statement MIN(t3.id) in MAX(t3.id) zu ändern.

Um ohne SUB- SELECTS automatisch doppelte Einträge zu löschen kommt man um einige Handarbeit leider nicht rum, man kann aber sicherlich einiges von oben wieder verwerten und z.B. Zwischenergebnisse entweder in eine Temporäre Tabelle einfügen oder aber in eine Datei ausgeben (Stichwort SELECT INTO OUTFILE), die man dann mit einem Texteditor anpassen kann.

HTH,

Andy
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
Prüfung ob und welche Variablen übergeben wurden StilgarBF PHP Grundlagen 4 19.04.2005 14:28:01
Tabelle von Dubletten befreien kruschde MySQLi/PDO/(MySQL) 1 05.11.2004 10:07:33
Formmailer mit Prüfung Silenthil PHP für Fortgeschrittene und Experten 1 18.05.2003 12:28:34


Alle Zeitangaben in WEZ +2. Es ist jetzt 09:16:54 Uhr.


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


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