php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 24-01-2011, 16:24
Ghostrider28
 Registrierter Benutzer
Links : Onlinestatus : Ghostrider28 ist offline
Registriert seit: May 2010
Beiträge: 111
Ghostrider28 befindet sich auf einem aufstrebenden Ast
Standard Langsamer left outer join

Moin zusammen,

ich stehe ein klein wenig auf dem Schlauch.
Bisher habe ich noch nie mit Joins gearbeitet.

Nun habe ich zwei Tabellen, eine Benutzertabelle, wenige User ( ~ 10 ) und eine Tabelle mit Mobilfunkzellen IDs (~ 1.500.000).

Nun möchte ich anhand eines LEFT OUTER Joins (laut MySQL Doku dürfte der doch der Richtige sein) alle ZellenIDs aus Tabelle 2 ausgeben, die mit einer BenutzerID x verknüpft sind.
Leider dauert die Query sehr lange (18 Sekunden).

Die id's sind Primärschlüssel.

Gegeben sind folgende Tabellen:


Benutzertabelle:



| id | benutzer
---------------
| 1 | Name1
| 2 | Name2
| 3 | Name3
| 4 | Name4
| 5 | Name5
| 6 | Name6
| 7 | Name7


Zellentabelle:


| id | zellenID | benutzerID
-------------------------
| 1 | 111111111 | 3
| 2 | 222222222 | 1
| 3 | 333333333 | 5
| 4 | 444444444 | 7
| 5 | 555555555 | 6
| 6 | 666666666 | 4
| 7 | 777777777 | 2

(....)



Das ist bis dato meine Query:

SELECT A.id, A.benutzer, B.id, B.zellenID, B.benutzerID FROM benutzertabelle AS A LEFT OUTER JOIN zellentabelle AS B ON B.benutzerID = A.id WHERE A.benutzer = '1' ORDER by B.id DESC

Liegt der Geschwindigkeitsdefizit an meiner Query oder liegts eher an der Anzahl der verfügbaren ZellenIDs? 1.5 Mio. sollte doch eigentlich kein Problem sein, oder?

Danke im Voraus fürs Lesen und vielleicht auch für einen Tip ;-)
Mit Zitat antworten
  #2 (permalink)  
Alt 24-01-2011, 17:05
code-kobold
 Registrierter Benutzer
Links : Onlinestatus : code-kobold ist offline
Registriert seit: Nov 2009
Beiträge: 22
code-kobold befindet sich auf einem aufstrebenden Ast
Standard

Liegt ein Index über B.benutzerID?

Lass dir mal
Code:
EXPLAIN SELECT...
ausgeben.

GR,

Ron
Mit Zitat antworten
  #3 (permalink)  
Alt 24-01-2011, 17:41
Ghostrider28
 Registrierter Benutzer
Links : Onlinestatus : Ghostrider28 ist offline
Registriert seit: May 2010
Beiträge: 111
Ghostrider28 befindet sich auf einem aufstrebenden Ast
Standard

Habe das Ganze gerade mal an einer kleineren Tabelle probiert, Aufbau ist aber selbiger.

Tabelle 1 Benutzerdaten (ca. 10), andere Tabelle ca 600.000 Positionsdaten.

EXPLAIN SELECT A.tracking_id, A.unit, B.field_1, B.field_3, B.field_4, B.field_5, B.field_6, B.field_7, B.id
FROM tracking_ids AS A
INNER JOIN kd10001_on10001 AS B ON B.field_1 = A.tracking_id
WHERE A.reseller_id = '7'
ORDER BY B.id DESC
LIMIT 1

Resultat des Explains:

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE A ALL tracking_id NULL NULL NULL 11 Using where; Using temporary; Using filesort
1 SIMPLE B ref field_1,indexField1 field_1 18 kd10001_on10001_.A.tracking_id 1316 Using where

Auf der Spalte mit den (wenigen) Geräte IDs liegt kein Index (Benutzertabelle), auf der Spalte mit den (vielen) Gerätes IDs (Positionstabelle) liegt einer.
Mit Zitat antworten
  #4 (permalink)  
Alt 24-01-2011, 17:54
TBT
  Moderator
Links : Onlinestatus : TBT ist offline
Registriert seit: Sep 2002
Ort: Berlin
Beiträge: 2.787
TBT befindet sich auf einem aufstrebenden Ast
TBT eine Nachricht über ICQ schicken TBT eine Nachricht über AIM schicken TBT eine Nachricht über Yahoo! schicken
Standard

auf A.reseller_id gehört ein Index!

besser noch (reseller_id,id) wegen der Sortierung
__________________
TBT

Die zwei wichtigsten Regeln für eine berufliche Karriere:
1. Verrate niemals alles was du weißt!


PHP 2 AllPatrizier II Browsergame
Mit Zitat antworten
  #5 (permalink)  
Alt 24-01-2011, 18:01
AmicaNoctis
  Moderatorin
Links : Onlinestatus : AmicaNoctis ist offline
Registriert seit: Jul 2009
Beiträge: 5.709
Blog-Einträge: 9
AmicaNoctis sorgt für eine eindrucksvolle AtmosphäreAmicaNoctis sorgt für eine eindrucksvolle Atmosphäre
Standard

Genauer gesagt, gehört ein Index auf alle Spalten, die in der ON-Klausel eines Joins oder üblicherweise in der Where-Klausel auftauchen. Darüber hinaus frage ich mich, ob du wirklich einen Left Join wolltest oder dir nicht vielleicht ein (inner) Join gereicht hätte, denn du wolltest ja
Zitat:
alle ZellenIDs aus Tabelle 2 ausgeben, die mit einer BenutzerID x verknüpft sind
Ein Left Join geht noch einen Schritt weiter, weil er ersmal alle Benutzer ausgibt und die ZellenIDs aus Tabelle 2 nur sofern vorhanden. Wenn dir ein (inner) Join reicht, kannst du die Tabellen auch vertauschen und dann kann MySQL sogar einen Equi-Join draus machen, der nochmal etwas schneller ist.

Gruß,

Amica
__________________
Hast du die Grundlagen zur Fehlersuche gelesen? Hast du Code-Tags benutzt?
Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
Super, danke!
Mit Zitat antworten
  #6 (permalink)  
Alt 24-01-2011, 18:26
Ghostrider28
 Registrierter Benutzer
Links : Onlinestatus : Ghostrider28 ist offline
Registriert seit: May 2010
Beiträge: 111
Ghostrider28 befindet sich auf einem aufstrebenden Ast
Standard

So, alle Spalten, die in einer ON Klausel oder einer WHERE Klausel vorkommen sind indiziert.

Habe es dann zunächst mit einem INNER JOIN sowie mit einem LEFT OUTER JOIN versucht, dauerte jeweils rund 17 Sekunden.

Habe es dann mal mit folgender Query versucht:

mysql> SELECT * FROM tracking_ids AS A, kd10001_on10001 AS B
-> WHERE A.reseller_id = '7' AND A.tracking_id = B.field_1 ORDER BY B.id DESC LIMIT 1

Und dies ist das Ergebnis:
1 row in set (1 min 51.67 sec)

Ich glaube, da habe ich gründlich was falsch gemacht.
Mit Zitat antworten
  #7 (permalink)  
Alt 24-01-2011, 19:02
linuxfred
 Registrierter Benutzer
Links : Onlinestatus : linuxfred ist offline
Registriert seit: Jan 2011
Ort: München
Beiträge: 5
linuxfred befindet sich auf einem aufstrebenden Ast
Standard

Hallo,

ich bin auch ein Neuling, aber 4 Augen sehen manchmal mehr.

Frage:
Wie lange dauert die einfache Abfrage der ID der Table mit
den 1.500.000 Einträgen? (select ID from table)
(Ich gehe mal davon aus, dass Dein Datenbankserver ausreichend
Ressourcen hat.)

Ich habe derzeit kein shell-/php- script rumzuliegen, welches mir mal schnell
2.000.000 Einträge generiert sonst könnte ich sagen wie lange es bei mir
dauert.

Linuxfred
__________________
Vielen Dank schon mal; der
Linuxfred
Mit Zitat antworten
  #8 (permalink)  
Alt 24-01-2011, 19:18
Ghostrider28
 Registrierter Benutzer
Links : Onlinestatus : Ghostrider28 ist offline
Registriert seit: May 2010
Beiträge: 111
Ghostrider28 befindet sich auf einem aufstrebenden Ast
Standard

Ein reiner Select auf eine willkürliche (aber natürlich existierende) Geräte-ID (Feld: field_1):

SELECT * FROM kd10001_on10001 where field_1 = xyz

84203 rows in set (1.89 sec)
Mit Zitat antworten
  #9 (permalink)  
Alt 24-01-2011, 20:08
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Lade dir mal das Script von https://launchpad.net/mysql-tuning-primer runter und führe es aus. Es untersucht dein Setup und gibt Hinweise zur Optimierung.

Mir ist aufgefallen, dass du Strings als IDs verwendest. Das solltest du ändern, numerische Vergleiche sind schneller.
Mit Zitat antworten
Antwort

Lesezeichen


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

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
MYSQL: Left (Outer) Join oder Ich brauche Hilfe australien2006 SQL / Datenbanken 3 17-10-2006 09:30
[SQL allgemein] LEFT OUTER JOIN klappt nicht Andreas62 SQL / Datenbanken 18 23-05-2005 16:17
Zählfehler bei count() und left outer join schmalle SQL / Datenbanken 4 04-08-2003 09:00
LEFT OUTER JOIN (Performance)? mrhappiness SQL / Datenbanken 16 15-06-2003 20:50
LEFT OUTER JOIN? kaot SQL / Datenbanken 2 02-08-2001 16:20

Themen-Optionen
Thema bewerten
Thema bewerten:

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 an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

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