Antwort
 
Themen-Optionen
Alt 04.06.2006, 22:52 Nach oben    #1
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard Welches Join soll ich verwenden?

Abend,
selbstverständlich möchte ich die beste Performance bei meinem Script, an dem ich derzeit entwickle, erreichen. Dabei geht es mir grad um die Frage, welches JOIN am schnellsten läuft (in folgendem Fall
Code:
SELECT
        c.installdate, c.styleid,
        s.stylename, s.stylepath
FROM
        xpc1_settings AS c
INNER JOIN
        xpc1_styles AS s
ON
        s.styleid = c.styleid
Ich will ja lediglich übergreifend Felder auslesen (manchmal auch für mehrere Tabellen)..

1) Ich hab irgendwo mal flüchtig gelesen, man soll Index auf die Spalten setzen? Aber wie jetzt, auf alle die ich überkreuz ausles?

2) Ist LEFT, RIGHT (outer) JOIN besser geeignet und wenn ja, warum?
Danke im Vorraus..
Ich frag bewuss thier nach, da sich die Leute in Foren oft drum streiten..
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.06.2006, 13:23 Nach oben    #2
Benutzer
 
Registriert seit: 31.12.2005
Beiträge: 90
Standard

der unterschied zwischen left / right / inner join ist der, dass die ergebnismenge anders ist.
du kannst z.b. einen right join durch einen left join ersetzten, müsstest dabei aber die tabellenreihenfolge tauschen

hier ists gut erklärt:
http://www.little-idiot.de/mysql/mysql-118.html

indizes setzt du am besten auf die spalten, die in den bedingungen vorkommen, also in deinem fall s-styleid und c.styleid.

die queries testest / optimierst du am besten mit phpmyadmin und explain:
einfach vor den query ein explain schreiben und in phpmyadmin ausführen, dann siehst du, welche indizes mysql nutzt.

dort kannst du dann weiter optimierren
björn ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.06.2006, 13:29 Nach oben    #3
Christian Mühlroth
 
Benutzerbild von Chr!s
 
Registriert seit: 04.09.2005
Ort: Nürnberg
Beiträge: 561
Standard

Gut und danke für den Tipp mit Explain, das kannte ich noch nicht.
__________________
http://www.ChrisDiary.De
Chr!s ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 05.06.2006, 13:40 Nach oben    #4
Benutzer
 
Registriert seit: 31.12.2005
Beiträge: 90
Standard

gern geschehen
björn ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.07.2006, 06:52 Nach oben    #5
leftover when bar closes
 
Benutzerbild von dsxs
 
Registriert seit: 29.06.2006
Ort: Bern
Beiträge: 123
Standard

Ich hab hier auch gleich 'ne Frage dazu.

Folgendes: ich habe zwei Tables, eine angenommen "tab1" die andere "tab2".
tab2 beinhaltet ein feld namens parent_id, steht also quasi für etwas untergeordnetes und ist verbunden mit einer jeweiligen id aus "tab1". "tab1" beinhaltet somit die Parents, die Hauptgruppen.

Was ich mit normalen SELECT's kriege ist ein solches Array:

Array
(
[0] => Array
(
[id] => 1
[name] => asdf
)

[1] => Array
(
[id] => 1
[name] => asdf
)

[2] => Array
(
[id] => 1
[name] => asdf
)
)

Was ich nun möchte, ist folgendes


Array
(
[0] => Array
(
[id] => 1
[name] => asdf
[sub] => Array
(
[id] => 1
[name] => sub1
[parent] => 1
)
)

[1] => Array
(
[id] => 2
[name] => fdasf
[sub] => Array
(
[id] => 3
[name] => sub2
[parent] => 2
)
)

[2] => Array
(
[id] => 3
[name] => dritter parent
[sub] => Array
(
[id] => 2
[name] => sub3
[parent] => 3
)
)
)


Ich könnte das selbstverständlich mit Unmengen an queries lösen, aber das ist weder sexy noch praktisch. Ich habe noch nie mit Joins gearbeitet und meine ersten Schritte fallen auch sehr erfolglos aus.

Hier, was ich mir bisher im Web zusammensuchen konnte.

PHP-Code:
$dbh_core->query("SELECT tab1.id,tab1.name FROM tab1 LEFT JOIN tab2 ON tab1.id=tab2.parent ORDER BY tab1.id ASC"); 

Ich habe testhalber 11 Datensätze in tab1, 3 Stück in tab2 (diese haben als parent die id 5, also dementsprechend sollten sie zum 5. Eintrag in tab1 geklebt werden). Die Query gibt mir jedoch 14 Einträge aus.

Gibt es denn keinen Weg, die beiden Tabs zusammenzuschmelzen, wo liegt mein Fehler?

Danke für die Hilfe Leuts.

Gruss
__________________
Unkraut ist die Opposition der Natur gegen die Regierung der Gärtner.
ticketbörse

dsxs ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.07.2006, 09:54 Nach oben    #6
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard

Exportiere mal deine Tabellen und poste oder hänge sie hier an.
Auf arbeit (in ner Stunde) werd ichs mal durchgehen und schaun ob ich dir helfen kann.
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.07.2006, 12:04 Nach oben    #7
leftover when bar closes
 
Benutzerbild von dsxs
 
Registriert seit: 29.06.2006
Ort: Bern
Beiträge: 123
Standard

Hier der DROP der Tabelle "events"

Zitat:
CREATE TABLE `events` (
`id` int(9) NOT NULL auto_increment,
`show_in_shop` int(1) NOT NULL default '0',
`top_event` int(1) NOT NULL default '0',
`is_locked` int(1) NOT NULL default '0',
`datetime` datetime NOT NULL default '0000-00-00 00:00:00',
`doors_open` varchar(5) NOT NULL default '00:00',
`organizer` int(3) NOT NULL default '0',
`location` int(3) NOT NULL default '0',
`categorie` int(3) NOT NULL default '0',
`age_limit` int(3) NOT NULL default '0',
`wheelchairs` int(3) NOT NULL default '0',
`title` varchar(150) NOT NULL default '',
`subtitle_d` varchar(255) NOT NULL default '',
`subtitle_e` varchar(255) NOT NULL default '',
`subtitle_f` varchar(255) NOT NULL default '',
`description_d` text NOT NULL,
`description_e` text NOT NULL,
`description_f` text NOT NULL,
PRIMARY KEY (`id`)
) TYPE=MyISAM;
Und folgend die Tab events_categories.

Zitat:
CREATE TABLE `events_categories` (
`id` int(9) NOT NULL auto_increment,
`show_in_shop` int(1) NOT NULL default '1',
`is_locked` int(1) NOT NULL default '0',
`type` int(1) NOT NULL default '0',
`event_id` int(9) NOT NULL default '0',
`parent` int(9) NOT NULL default '0',
`level` int(3) NOT NULL default '0',
`title_d` varchar(100) NOT NULL default '',
`title_e` varchar(100) NOT NULL default '',
`title_f` varchar(100) NOT NULL default '',
`theoretisch` int(9) NOT NULL default '0',
`provisorisch` int(9) NOT NULL default '0',
`praktisch` int(9) NOT NULL default '0',
`vp` decimal(9,2) NOT NULL default '0.00',
PRIMARY KEY (`id`)
) TYPE=MyISAM;
"id" aus der ersten und "event_id" aus der zweiten Tabelle sollten "zusammengekleistert" werden, in Form des vorgenannten mehrdimensionale n Arrays. "event_id" entspricht dabei immer einer id aus dem ersten Table.
Ein Event kann x beliebige Kategorien haben.

Hier mein momentaner, funktiontüchtiger aber alles andere als sexy Code
Wird Zeit, dass ich die JOINS lerne

PHP-Code:
// get all events in database
$dbh_core->query("SELECT id,show_in_shop,top_event,is_locked,DATE_FORMAT(datetime,'%d.%m.%y') AS date,categorie,title FROM events ORDER BY id ASC");
$events $dbh_core->fetch_array();

foreach (
$events as $entry) {
    
// iterate over each event and get categories
    
$dbh_core->query("SELECT id,show_in_shop,is_locked,type,parent,level,title_d FROM events_categories WHERE event_id='".$entry['id']."'");
    
$categories $dbh_core->fetch_array();
    
    if (
$dbh_core->num_rows() != 0) {
        foreach (
$categories as $category) {
            if (
$category['type'] == || $category['type'] == 1) {
                
// this category is a group!
                
$events[$entry['id']-1]['categories'][$category['level']-1] = $category;
            }
            if (
$category['type'] == 2) {
                
// this category holds seats!
                
$events[$entry['id']-1]['categories'][$category['parent']-1]['subs'][$category['level']-1] = $category;        
            }
        }
    }

__________________
Unkraut ist die Opposition der Natur gegen die Regierung der Gärtner.
ticketbörse

dsxs ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.07.2006, 12:32 Nach oben    #8
Martin Breuer
 
Benutzerbild von WarrenFaith
 
Registriert seit: 17.08.2005
Ort: Berlin
Beiträge: 1.642
Standard

Hast mich ja genau zum Mittagessen erwischt.
Hab geduld!
__________________
I did it my way - Senseless-Blog
WarrenFaith ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Alt 06.07.2006, 12:33 Nach oben    #9
leftover when bar closes
 
Benutzerbild von dsxs
 
Registriert seit: 29.06.2006
Ort: Bern
Beiträge: 123
Standard

Keine Frage... Wie gesagt, funktioniert soweit wie gewünscht, die Verbesserung stresst nicht.

Guten 'tit!
__________________
Unkraut ist die Opposition der Natur gegen die Regierung der Gärtner.
ticketbörse

dsxs ist offline  
Add Post to del.icio.usBookmark Post in TechnoratiDiesen Beitrag zu Mister Wong hinzufügen!
Mit Zitat antworten
Antwort

Lesezeichen


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

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Klasse in Klasse verwenden? goelliboy PHP-Programmierung 12 07.09.2007 11:43
Join und Mysql5 Creativ Datenbanken 6 13.10.2006 14:25
left join vs from table1, table2 ex³ Datenbanken 1 29.05.2006 21:24
mit LEFT OUTER JOIN mehr als 2 Tabellen verknüpfen ? Alpha Centauri Datenbanken 4 06.04.2006 19:00
2 Abfragen einer Tabelle zusammenfassen - JOIN? derMaggus Datenbanken 15 24.08.2005 17:40


Alle Zeitangaben in WEZ +2. Es ist jetzt 11:13 Uhr.


Powered by vBulletin® Version 3.7.3 (Deutsch)
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44