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 29.04.2011, 15:50:05
mikexxl mikexxl ist offline
Anfänger
 
Registriert seit: Apr 2011
Alter: 57
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
Mit Zitat antworten
  #2  
Alt 29.04.2011, 18:14:03
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
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 18:29:14 Uhr) Grund: Korrektur
Mit Zitat antworten
  #3  
Alt 29.04.2011, 19:16:08
mikexxl mikexxl ist offline
Anfänger
 
Registriert seit: Apr 2011
Alter: 57
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
Mit Zitat antworten
  #4  
Alt 29.04.2011, 19:24:55
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: Tabellenvergleich performance

Zitat:
Zitat von mikexxl Beitrag anzeigen
..
`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.
Mit Zitat antworten
  #5  
Alt 29.04.2011, 19:30:48
mikexxl mikexxl ist offline
Anfänger
 
Registriert seit: Apr 2011
Alter: 57
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
Mit Zitat antworten
  #6  
Alt 29.04.2011, 19:37:54
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: Tabellenvergleich performance

Zitat:
Zitat von mikexxl Beitrag anzeigen
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 19:40:16 Uhr) Grund: Korrektur COLLATE utf8_unicode_ci
Mit Zitat antworten
  #7  
Alt 29.04.2011, 20:11:54
mikexxl mikexxl ist offline
Anfänger
 
Registriert seit: Apr 2011
Alter: 57
Beiträge: 10
AW: Tabellenvergleich performance

Muss ich dafür den vorhandenen Prozess beenden?
Mit Zitat antworten
  #8  
Alt 29.04.2011, 20:28:28
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
Beiträge: 395
AW: Tabellenvergleich performance

Zitat:
Zitat von mikexxl Beitrag anzeigen
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.
Mit Zitat antworten
  #9  
Alt 29.04.2011, 20:46:28
mikexxl mikexxl ist offline
Anfänger
 
Registriert seit: Apr 2011
Alter: 57
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 21:05:05 Uhr)
Mit Zitat antworten
  #10  
Alt 29.04.2011, 21:45:11
thomas_w thomas_w ist offline
Junior Member
 
Registriert seit: Aug 2010
Alter: 14
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 21:53:46 Uhr) Grund: EDIT
Mit Zitat antworten
Antwort

Stichworte
performance, tabelle, vergleich


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
Performance bei function ? -=LUPO=- PHP für Fortgeschrittene und Experten 2 26.04.2007 12:25:18
mysql Performance Problem SELECT mit FORCE INDEX coller MySQLi/PDO/(MySQL) 0 19.04.2007 17:39:24
Performance: Konstanten, String Vars, Array crowl PHP Grundlagen 1 10.03.2004 14:22:53
performance frage RDJ PHP Grundlagen 8 04.03.2004 10:34:49
Anfragen, bzw. Antworten an einen Server ...Performance ??? RDJ Apache HTTP-Server 0 25.09.2003 16:41:20


Alle Zeitangaben in WEZ +2. Es ist jetzt 19:41:47 Uhr.


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


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