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
  #16 (permalink)  
Alt 27-04-2009, 23:00
Peacie
 Registrierter Benutzer
Links : Onlinestatus : Peacie ist offline
Registriert seit: Nov 2003
Beiträge: 341
Peacie ist zur Zeit noch ein unbeschriebenes Blatt
Peacie eine Nachricht über ICQ schicken Peacie eine Nachricht über AIM schicken Peacie eine Nachricht über Yahoo! schicken
Standard

und unter welchen voraussetzungen würde die session var geändert ?
denke über eine db abfrage

in einem projekt von mir wird einfach bei jedem eintreffen einer nachricht einmal in einem entsprechenden feld der wert für nachrichten und ungelesene nachrichten gespeichert. diese beiden werte werden mit allen anderen relevanten userdaten in die session gespeichert. die 2. stelle an der diese beiden zahlen aktualisiert werden, ist wenn der user tatsächlich die nachricht liest.
es muss also nicht bei jedem seitenaufruf gerechnet werden sondern nur an diesen beiden stellen
__________________
Mibau Datendesign - Online Ferienwelt
Mit Zitat antworten
  #17 (permalink)  
Alt 27-04-2009, 23:04
martinm79
 Registrierter Benutzer
Links : Onlinestatus : martinm79 ist offline
Registriert seit: Jan 2004
Ort: Deutschland
Beiträge: 744
martinm79 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

So, das mit der Nachricht ist ja nun klar.
Der User wird es einfach aus der Session entnehmen. Und das ist ein anderes Thema.

Und falls man es "zum Anfang" in der User Tabelle zwischenspeichert, habe ich auch gleich mal die Zeit gemessen.
Alte Abfrage: 0.02 bei 300000 Nachrichten.
Bei 5 Millionen möchte ich die Zahl garnicht lesen.

Ich kam auf 0.0009 und 0.0008 wenn ich beim 1. Feld gezielt aus 300000 Datensatze lese und beim 2. aus einer Usertabelle gezielt rauslese.
Damit kann man auch "erstmal" bei jedem Seitenaufruf leben.



Mit dem optimieren von SQL bin ich aber noch nicht schlauer geworden.
Die folgende Abfrage ist zwar nur auf der Übersichtsseite, dauert aber 0.03 bis 1.0 Sekunden und ich weiß nicht, wie ich da richtig den Index setzten soll. (Oder was ich verändern müßte)

PHP-Code:
SELECT
    u
.geschlecht_id,
    
u.nick,
    IF(
u.online,IF(UNIX_TIMESTAMP()-UNIX_TIMESTAMP(u.datum_aktiv) < 3600,1,0),0online
FROM  prefix_visit v
LEFT JOIN prefix_user u
    ON  u
.user_id v.visit_user_id
WHERE
    v
.user_id '%d'
AND 
    
u.del_user_id 0
AND 
    
u.aktiviert 1
AND 
    
u.spam <> 1
GROUP BY v
.visit_id
ORDER BY v
.datum DESC
LIMIT 5 
Die Abfrage ermittelt nur die letzten 5 Profilbesucher.
Die Geschlecht ID, den Nicknamen und den Status (online / offline)

Die beiden Tabellen sind so aufgebaut.
PHP-Code:
CREATE TABLE prefix_visit (
  
visit_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  
user_id INTEGER UNSIGNED NULL,
  
visit_user_id INTEGER UNSIGNED NOT NULL,
  
datum DATETIME NULL,
  
PRIMARY KEY(visit_id),
  
INDEX prefix_visit_FKIndex1(user_id),
  
INDEX prefix_visit_FKIndex2(visit_user_id)
);


CREATE TABLE prefix_user (
  
user_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
  ...
  
geschlecht_id TINYINT(1UNSIGNED NOT NULL DEFAULT 0,
  
nick VARCHAR(40NULL,
  
datum_aktiv DATETIME NULL,
  
del_user_id INTEGER UNSIGNED NOT NULL DEFAULT 0,
  
aktiviert TINYINT(1UNSIGNED NOT NULL DEFAULT 0,
  
online TINYINT(1UNSIGNED NOT NULL DEFAULT 0,
  
spam INTEGER UNSIGNED NOT NULL DEFAULT 0,
  ...
  
PRIMARY KEY(user_id),
  
INDEX prefix_FKIndex1(geschlecht_id),
  
INDEX prefix_FKIndex2(land_id),
  
INDEX prefix_FKIndex3(bundesland_id),
  
INDEX prefix_FKIndex4(familienstatus_id),
  
INDEX prefix_FKIndex5(raucher_id),
  
INDEX prefix_FKIndex6(haushalt_id),
  
INDEX prefix_FKIndex7(kinderwunsch_id),
  
INDEX prefix_FKIndex8(haare_id),
  
INDEX prefix_FKIndex9(augen_id),
  
INDEX prefix_FKIndex10(figur_id),
  
INDEX prefix_FKIndex11(s_geschlecht_id),
  
INDEX prefix_FKIndex12(s_haushalt_id)
); 
Ein Explain Ergebnis habe ich im Anhang rangehangen.
Wäre top wenn ich da mal ein Tipp bekommen könnte, wie ich bei sowas vorgehen muß und worauf ich achten muß.

Bei mir local lief ja alles top, aber online bei mehr Datensätzen darf es nicht manchmal 1 Sekunde dauern.
Angehängte Grafiken
Dateityp: jpg explain.jpg (14,8 KB, 50x aufgerufen)
__________________
Gut geraten ist halb gewußt.
Mit Zitat antworten
  #18 (permalink)  
Alt 27-04-2009, 23:11
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Tabelle visit:
INDEX prefix_visit_FKIndex1(user_id),
ändere den mal auf
(user_id, datum)

Danach noch mal EXPLAIN und posten bitte.
Mit Zitat antworten
  #19 (permalink)  
Alt 27-04-2009, 23:30
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von martinm79
IF(u.online,IF(UNIX_TIMESTAMP()-UNIX_TIMESTAMP(u.datum_aktiv) < 3600,1,0),0) online
Wenn du immer erst auf Unix Timestamps umrechnest, wird es natürlich länger dauernd. Warum verwendest du nicht einfach normale DATETIME-Werte?
Mit Zitat antworten
  #20 (permalink)  
Alt 28-04-2009, 00:46
martinm79
 Registrierter Benutzer
Links : Onlinestatus : martinm79 ist offline
Registriert seit: Jan 2004
Ort: Deutschland
Beiträge: 744
martinm79 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

@ghostgambler Ich habe das Feld Datum mal komplett weggelassen, da die Zeit nicht releveant ist sondern nur die Reihenfolge, habe dafür einfach das Feld visit_id genommen.

@h3ll Danke für den Hinweis. Konnte zum Anfang gut damit rechnen, werde ich aber umstellen.
Habe es jetzt zu testzwecken auch mal komplett weggenommen.


Hier nochmal die neue Abfrage. Einfach nur der Nickname, der zuletzt auf dem jeweiligen Profil war.

Die Abfrage dauerte 1.0960 sek

PHP-Code:
SELECT
    u
.nick
FROM  prefix_visit v
LEFT JOIN prefix_user u
    ON  u
.user_id v.visit_user_id
WHERE
    v
.user_id '%d'
AND
    
u.del_user_id 0
AND
    
u.aktiviert 1
AND
    
u.spam <> 1
GROUP BY v
.visit_id
ORDER BY v
.visit_id DESC
LIMIT 5 
Ein Bild von dem Explain Ergebnis habe ich rangehangen.
Wie werte ich sowas richtig aus?
__________________
Gut geraten ist halb gewußt.
Mit Zitat antworten
  #21 (permalink)  
Alt 28-04-2009, 01:13
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Mach mal statt dem LEFT einen INNER JOIN.
Mit Zitat antworten
  #22 (permalink)  
Alt 28-04-2009, 01:14
martinm79
 Registrierter Benutzer
Links : Onlinestatus : martinm79 ist offline
Registriert seit: Jan 2004
Ort: Deutschland
Beiträge: 744
martinm79 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Ich glaube ich muß da auch ganz anders vorgehen.

Also ich habe mal die einfache Abfrage probiert:

PHP-Code:
SELECT
    visit_id 
FROM  prefix_visit v
WHERE
    v
.user_id '%d'
GROUP BY v.visit_id
ORDER BY v
.visit_id DESC
LIMIT 5

Und selbst diese Abfrage dauerte zu lange.
Dann habe ich mal die letzte ID von diesem User genommen:
PHP-Code:
SELECT
    visit_id 
FROM  prefix_visit v
WHERE
    visit_id 
>= 869611
AND v.user_id '%d'
GROUP BY v.visit_id
ORDER BY v
.visit_id DESC
LIMIT 5

Dann ging die Abfragen mit 0.0002 Sekunden.

Ich muß also auch die Profilaufrufe und die letzte ID in der Conf / Session zwischenspeichern.
Und immer nur Abfragen ob es ein neuen Besucher auf dem Profil gibt.
__________________
Gut geraten ist halb gewußt.
Mit Zitat antworten
  #23 (permalink)  
Alt 28-04-2009, 01:22
martinm79
 Registrierter Benutzer
Links : Onlinestatus : martinm79 ist offline
Registriert seit: Jan 2004
Ort: Deutschland
Beiträge: 744
martinm79 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Danke nochmal an alle für die Hilfe.


Und komm ich in den temp/ Ordner wo die Session liegen oder kann ich einfach den temp/ bzw. Session Ordner in der php.ini ändern so das ich denn mittels php daran komme?


Dann speicher ich die Session ID beim einloggen in der DB und wenn ich Daten vom anderen User ändern möchte, hole ich mir die Session ID und änder die Session.

Geht das so? ^^
__________________
Gut geraten ist halb gewußt.
Mit Zitat antworten
  #24 (permalink)  
Alt 28-04-2009, 01:23
h3ll
 Registrierter Benutzer
Links : Onlinestatus : h3ll ist offline
Registriert seit: Mar 2008
Beiträge: 3.578
h3ll befindet sich auf einem aufstrebenden Ast
Standard

Hmm... sehr komisch. Optimier mal die Tabelle.
Mit Zitat antworten
  #25 (permalink)  
Alt 28-04-2009, 13:37
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Kein Explain-Output -> Keine vernünftige Antwort möglich.
Mit Zitat antworten
Antwort

Lesezeichen


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

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 20:15 Uhr.