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 |

29.04.2011, 16:50:05
|
Anfänger
|
|
Registriert seit: Apr 2011
Alter: 58
Beiträge: 10
|
|
Tabellenvergleich performance
Hallo,
habe mal eine echte Performancefrage zum Tabellenvergleich
Ausgangsituation:
Tabelle1 mit spalten a,b,x
Tabelle2 mit splaten g,h,i,j,x
In die Zieltabelle3 (g,h,i,j,x) sollen alle aus Tabelle2, die nicht in Tabelle1 sind.
Abgleich über x
Habe nun folgendes gemacht:
INSERT INTO `db`.`tab3`
SELECT *
FROM `db`.`tab2`
WHERE `x` not IN (SELECT x FROM `db`.`tab1`);
Es kam keine Fehlermeldung, allerding weiß ich nicht, was nun passiert. Der Prozess läuft, Time ist 339826.
Habe ich da schon einen Syntaxfehler (ein x ist ohne `)?
Die Herausforderung, beide Tabellen haben über 13 Mio Datensätze.
Nun muss ich das Beschleunigen:
System ist 64bit Prozessor, 4 GB Ram, Debian 64bit
MySQL ist die aktuelle LAMPP version, ist nur 32 bit. Evtl hier auf MySQL 5.5 64bit updaten (wie/howto)?
Ich benötige das LAMPP Paket eigentlich nicht, da ich via SSH auf der mysql-Konsole die Befehle eingebe.
Evtl. später, um die Befehle über eine Weboberfläche zu händeln.
Anstelle des where ein Join Befehl (danke für die Übersicht hier im Forum, habe es nun begriffen, super)?
Nun habe ich irgendwo schon gelesen, daß ich Tabelen sperren kann, Index muss nicht erstellt werden usw, wer hat da Erfahrung?
Danke für Eure Hilfe
MikeXXL
|

29.04.2011, 19:14:03
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 15
Beiträge: 395
|
|
AW: Tabellenvergleich performance
Zeige doch mal die Tabellenstrukturen
Code:
mysql>SHOW CREATE TABLE tab1;
mysql>SHOW CREATE TABLE tab2;
Folgendes ist auf jeden Fall falsch, da hier die Konstante 'x' mit der Spalte X verglichen wird.
Zitat:
..
WHERE `x` not IN (SELECT x FROM `db`.`tab1`);
..
|
KORREKTUR
Könnte doch richtig sein, da es sich ja um die Backticks und nicht um einfache Anführungsstriche handelt.
Zitat:
..
WHERE `x` not IN (SELECT x FROM `db`.`tab1`);
..
|
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 (29.04.2011 um 19:29:14 Uhr)
Grund: Korrektur
|

29.04.2011, 20:16:08
|
Anfänger
|
|
Registriert seit: Apr 2011
Alter: 58
Beiträge: 10
|
|
AW: Tabellenvergleich performance
Hier die Tabellen:
| tab1 | CREATE TABLE `tab1` (
`a` text COLLATE utf8_unicode_ci NOT NULL,
`b` text COLLATE utf8_unicode_ci NOT NULL,
`x` text COLLATE utf8_unicode_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
| tab2 | CREATE TABLE `tab2` (
`g` text COLLATE utf8_unicode_ci NOT NULL,
`h` text COLLATE utf8_unicode_ci NOT NULL,
`i` text COLLATE utf8_unicode_ci NOT NULL,
`j` text COLLATE utf8_unicode_ci NOT NULL,
`k` text COLLATE utf8_unicode_ci NOT NULL,
`l` text COLLATE utf8_unicode_ci NOT NULL,
`m` text COLLATE utf8_unicode_ci NOT NULL,
`n` text COLLATE utf8_unicode_ci NOT NULL,
`o` text COLLATE utf8_unicode_ci NOT NULL,
`p` text COLLATE utf8_unicode_ci NOT NULL,
`q` text COLLATE utf8_unicode_ci NOT NULL,
`r` text COLLATE utf8_unicode_ci NOT NULL,
`s` text COLLATE utf8_unicode_ci NOT NULL,
`x` text COLLATE utf8_unicode_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci |
MikeXXL
|

29.04.2011, 20:24:55
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 15
Beiträge: 395
|
|
AW: Tabellenvergleich performance
Zitat:
Zitat von mikexxl
..
`x` text COLLATE utf8_unicode_ci NOT NULL
..
|
Au weia, Du willst TEXT Spalte miteinander vergleichen.
Ermittel doch mal die max. Länge der X Spalten. Eventuell läßt sich da noch was reparieren.
Code:
SELECT MAX(length(x)) FROM tab1;
SELECT MAX(length(x)) FROM tab2;
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
|

29.04.2011, 20:30:48
|
Anfänger
|
|
Registriert seit: Apr 2011
Alter: 58
Beiträge: 10
|
|
AW: Tabellenvergleich performance
Prima, hab es ja schon vermutet,
in tab 1 max 20
in tab 2 max 44
kann mir die 44 noch nicht erklären, normal wären auch so ca 20
seis drum
Gruß
MikeXXL
|

29.04.2011, 20:37:54
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 15
Beiträge: 395
|
|
AW: Tabellenvergleich performance
Zitat:
Zitat von mikexxl
in tab 1 max 20
in tab 2 max 44
|
Hast Du einen Backup der Tabellen, ja?
Also im ersten Schritt machen wir anstatt TEXT ein VARCHAR(50). Vorerst mal mit der Spalte x. (auch bei der Zieltabelle)
Code:
ALTER TABLE tab1
CHANGE x x VARCHAR(50) NOT NULL COLLATE utf8_unicode_ci ;
ALTER TABLE tab2
CHANGE x x VARCHAR(50) NOT NULL COLLATE utf8_unicode_ci ;
Wenn das durchläuft, legen wir mal einen Index an.
Code:
ALTER TABLE tab1
ADD KEY idx_x (x);
ALTER TABLE tab2
ADD KEY idx_x (x);
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 (29.04.2011 um 20:40:16 Uhr)
Grund: Korrektur COLLATE utf8_unicode_ci
|

29.04.2011, 21:11:54
|
Anfänger
|
|
Registriert seit: Apr 2011
Alter: 58
Beiträge: 10
|
|
AW: Tabellenvergleich performance
Muss ich dafür den vorhandenen Prozess beenden?
|

29.04.2011, 21:28:28
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 15
Beiträge: 395
|
|
AW: Tabellenvergleich performance
Zitat:
Zitat von mikexxl
Muss ich dafür den vorhandenen Prozess beenden?
|
Welchen Prozess? Die Datenbankengine muss natürlich laufen für die ALTER TABLE.
Grüße
Thomas
__________________
Die SQL-Backstube
Bietet Rezepte, Lösungen und ausführliche Beispiele rund um gesundes SQL und zufriedene Datenbanken.
|

29.04.2011, 21:46:28
|
Anfänger
|
|
Registriert seit: Apr 2011
Alter: 58
Beiträge: 10
|
|
AW: Tabellenvergleich performance
Naja, der Abgleich läuft,
wird angezeigt bei show prozesslist
habe beide tabellen kopiert, neue zieltabelle erstellt, x geändert, key definiert
Geändert von mikexxl (29.04.2011 um 22:05:05 Uhr)
|

29.04.2011, 22:45:11
|
Junior Member
|
|
Registriert seit: Aug 2010
Alter: 15
Beiträge: 395
|
|
AW: Tabellenvergleich performance
Dann versuchen wir mal ersten Test
a) EXPLAIN um den Zugriffspfad zu kontrollieren
Code:
EXPLAIN
SELECT COUNT(*)
FROM tab2
LEFT JOIN tab1
ON tab1.x = tab2.x
WHERE tab1.x IS NULL;
Die EXPLAIN-Ausgabe sieht so ähnlich aus. Die in der MySQL Console ausführen.
Code:
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+
| 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Impossible WHERE noticed after reading const tables |
+----+-------------+-------+------+---------------+------+---------+------+------+-----------------------------------------------------+
1 row in set (0.00 sec)
mysql>
b) Treffer zählen und Zeit messen
Code:
SELECT COUNT(*)
FROM tab2
LEFT JOIN tab1
ON tab1.x = tab2.x
WHERE tab1.x IS NULL;
EDIT
c) Dies wäre auch noch interessant:
Code:
mysql>show global variables LIKE '%buffer%';
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 (29.04.2011 um 22:53:46 Uhr)
Grund: EDIT
|
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 14:38:29 Uhr.
|