Page 1 of 1

PHP: SELECT ... LIMIT 0,10 saulangsam

Posted: 2003-06-12 16:18
by energy2
Hallo,

ich hab eine seite die sehr oft aufgerufen wir, in der stunde sicher 1000 Mal, auf dieser seite hab ich einen SELECT (mysql) befehl der aus einer Tabelle mit 100.000 zeilen ein paar felder holt (3 int, 1 char(30)), das ganze in PHP.

Das Problem ist die Ausführzeit für den Query die alleine gut 0,3 Sekunden beträgt.

Code: Select all

SELECT foto_id, f_folder, f_comments, f_views FROM tbl_fotos WHERE f_event_id=502 LIMIT 0,1
Wenn ich das nun 1000 Datensätze abfrage

Code: Select all

SELECT foto_id, f_folder, f_comments, f_views FROM tbl_fotos WHERE f_event_id=502
(also ohne LIMIT 0,1) benötigt er die selbe zeit.


Gibt es hier eine möglichkeit eine zeitverbesserung zu erzielen die dann wiederum auch den server entlastet?

DANKE
energy

Re: PHP: SELECT ... LIMIT 0,10 saulangsam

Posted: 2003-06-12 16:23
by jtb
wie sieht die Tabellenstruktur genau aus?
Warum verwendest du Char? Ist das Feld wirklich immer voll ausgefüllt?

Re: PHP: SELECT ... LIMIT 0,10 saulangsam

Posted: 2003-06-12 16:53
by gamecrash
Hm, also wenn die Tabelle sehr viele Datensätze enthält (und so hört sich das mal an), probier mal einen Index auf f_event_id zu setzen...

Re: PHP: SELECT ... LIMIT 0,10 saulangsam

Posted: 2003-06-12 20:58
by energy2
1. die varchar(30) felder sind (fast) immer voll,
momentan sind 91.000 datensätze in der Tabelle,

Strukture wie folgt:

10 x int(5)
5 x int(3)
1 x tinyint(1)
3 x varchar(30)
1 x varchar(255)

Bei meiner abfrage hab ich ja nur ein paar felder, sollte schneller gehen.

Code: Select all

SELECT foto_id, f_folder, f_comments, f_views FROM tbl_fotos WHERE f_event_id=502 LIMIT 0,10;
Ich versteh nur nicht warum es gleich lange dauert wenn mir der mysql server alle liefert oder wenn mir der mysql server nur 10 bestimmte liefern soll.

Ich hab den index mal auf f_event_id (und foto_id) gestellt, hat keine zeit gebracht. (hatte nun 2 indizes..) hab dann nur den index auf f_event_id gestellt, auch keine zeitverbesserung.

Re: PHP: SELECT ... LIMIT 0,10 saulangsam

Posted: 2003-06-12 21:03
by outofbound
Das ist ganz einfach:

Der Querry ist der gleiche, nur werden halt nachher weniger übertragen...

er muss einfach alle abfragen, was er dir dann zurückliefert ist (Nen Teil oder alles) nimmt nur wenig rechenzeit in Anspruch ;)

Gruss,

Out

Re: PHP: SELECT ... LIMIT 0,10 saulangsam

Posted: 2003-06-12 21:03
by jtb
mach mal ein explain für die Query und poste es hier..

bitte achte in Posts immer auf genaue Infos! Char und Varchar sind grundsätzlich verschieden!

btw: Struktur einer Tabelle besser als Create Table - Statement posten..
Deine Struktur reicht nicht aus, um manche Fehler auszuschließen!

Re: PHP: SELECT ... LIMIT 0,10 saulangsam

Posted: 2003-06-12 21:20
by energy2
ok,

hier die Struktur:

Code: Select all

CREATE TABLE fotos (
  foto_id int(7) NOT NULL auto_increment,
  f_aktiv tinyint(1) default '0',
  f_date int(12) default NULL,
  f_event_id int(6) default '0',
  f_folder varchar(30) default NULL,
  f_foto_nr int(4) default '0',
  f_prev_foto int(7) default '0',
  f_next_foto int(7) default '0',
  f_fotograf_1 varchar(30) default '0',
  f_fotograf_1_id int(3) default NULL,
  f_fotograf_2 varchar(30) default NULL,
  f_fotograf_2_id int(3) default NULL,
  f_filesize int(6) default '0',
  f_width int(3) default '0',
  f_height int(3) default '0',
  f_mypic varchar(255) default NULL,
  f_vote int(5) default '0',
  f_votes int(5) default '0',
  f_comments int(4) default '0',
  f_views int(6) default '0',
  f_mailed int(5) default '0',
  PRIMARY KEY  (foto_id)
) TYPE=MyISAM;
mach ein explain für die Query und poste es hier ..
Sorry, das ist mir "explain" gemeint, einer erklärung abliefern?

danke!

Re: PHP: SELECT ... LIMIT 0,10 saulangsam

Posted: 2003-06-12 22:16
by jtb
wo bitte sind die Keys?

mach mal ein explain vor deinem Select und poste dann die Ausgabe..

Re: PHP: SELECT ... LIMIT 0,10 saulangsam

Posted: 2003-06-12 23:01
by olaf.dietsche
energy2 wrote:
mach ein explain für die Query und poste es hier ..
Sorry, das ist mir "explain" gemeint, einer erklärung abliefern?
Explain findest du hier erklärt: http://www.mysql.com/doc/de/EXPLAIN.html

Re: PHP: SELECT ... LIMIT 0,10 saulangsam

Posted: 2003-06-12 23:01
by coolsurfer
Hi,

gib mal als SQL-Statement ein:

Code: Select all

"EXPLAIN SELECT foto_id, f_folder, f_comments, f_views FROM tbl_fotos WHERE f_event_id=502 LIMIT 0,10"
und

Code: Select all

"EXPLAIN SELECT foto_id, f_folder, f_comments, f_views FROM tbl_fotos WHERE f_event_id=502"
und poste beide Ausgaben hier NACHDEM du einen zusätzlichen Index auf "f_event_id" gesetzt hast.

coolsurfer


---
PS: [bzgl. der neuen Regeln] Diese Nachricht darf vom Rootforum.de unbeschränkt verwendet werden;
jedoch geht das geistige Eigentum dieser Nachricht nicht in den Besitz des Rootforums über :-)

Re: PHP: SELECT ... LIMIT 0,10 saulangsam

Posted: 2003-06-13 10:03
by gamecrash
Ich zitier mich ganz einfach mal selber, hast Du wohl überlesen ;)
GameCrash wrote:probier mal einen Index auf f_event_id zu setzen...

Wenn ich's richtig im Kopf hab, wär das diese Syntax:

Code: Select all

ALTER TABLE fotos ADD INDEX (f_event_id);

Re: PHP: SELECT ... LIMIT 0,10 saulangsam

Posted: 2003-06-13 18:32
by energy2
Also das mit den Index auf f_event_id setzen hab ich bereits gemacht, hat aber keinen zeitgewinn mit sich gebracht. Nun, da ich endlich begriffen habe was mit EXPLAIN gemeint ist, hab ich diese 2 queries ausgeführt:

Code: Select all

"EXPLAIN SELECT foto_id, f_folder, f_comments, f_views FROM tbl_fotos WHERE f_event_id=502 LIMIT 0,10"
und

Code: Select all

"EXPLAIN SELECT foto_id, f_folder, f_comments, f_views FROM tbl_fotos WHERE f_event_id=502"

beim 1.:

Code: Select all

table  type  possible_keys  key  key_len  ref  rows  Extra  
fotos ALL NULL NULL NULL NULL 87258 where used 
beim 2. ist genau das selbe.

Re: PHP: SELECT ... LIMIT 0,10 saulangsam

Posted: 2003-06-13 18:49
by jtb
[x] du hast den Index nicht gemacht

poste nochmal das Create Table-Script (aber das aktuelle)..

Re: PHP: SELECT ... LIMIT 0,10 saulangsam

Posted: 2003-06-13 21:34
by energy2

Code: Select all

CREATE TABLE fotos (
  foto_id int(7) NOT NULL auto_increment,
  f_aktiv int(1) default '0',
  f_date int(12) default NULL,
  f_event_id int(6) NOT NULL default '0',
  f_folder varchar(30) default NULL,
  f_foto_nr int(4) default '0',
  f_prev_foto int(7) default '0',
  f_next_foto int(7) default '0',
  f_fotograf_1 varchar(30) default '0',
  f_fotograf_1_id int(3) default NULL,
  f_fotograf_2 varchar(30) default NULL,
  f_fotograf_2_id int(3) default NULL,
  f_filesize int(6) default '0',
  f_width int(3) default '0',
  f_height int(3) default '0',
  f_mypic varchar(255) default NULL,
  f_vote int(5) default '0',
  f_votes int(5) default '0',
  f_comments int(4) default '0',
  f_views int(6) default '0',
  f_mailed int(5) default '0',
  PRIMARY KEY  (foto_id,f_event_id)
) TYPE=MyISAM;
danke für die Hilfe!

Re: PHP: SELECT ... LIMIT 0,10 saulangsam

Posted: 2003-06-13 22:16
by jtb
argh..
du hast den Primary-Key geändert..
setze den bitte wieder zurück!

Und erstelle einen normalen Index auf die Spalte - der Syntax wurde ja schon gepostet..


BITTE schau dir SQL an :cry:

Re: PHP: SELECT ... LIMIT 0,10 saulangsam

Posted: 2003-06-13 22:36
by energy2
jope, so dumm bin ich also, hab den scheiss eben selbst bemerkt und hab beschlossen donnerstags nie wieder zu feiern, und seinen die bedienungen noch so ideal ;-)

hab nun den einen index bei f_event_id hinzugefügt, und das ergebnis wird 10 mal schon zurück geliefert.

Entschuldige bitte meinen Fehler, jetzt hab ich die gewünschte abfragezeit,

ein großes Danke!!!!!

Re: PHP: SELECT ... LIMIT 0,10 saulangsam

Posted: 2003-06-13 22:40
by jtb
kein Problem..

Du hast Glück, es sind dir wohl bei dem Fehler keine Daten kaputt gegangen..

Ein Grund, warum ich nur ausgeschlafen arbeite (oder es zumindest versuche)..

Re: PHP: SELECT ... LIMIT 0,10 saulangsam

Posted: 2003-06-13 22:51
by energy2
also datenverlust hätte es so oder so nicht geben soll da ich bei solchen aktionen, auch wenn ich müde und unkonzentriert bin, vorher ein BackUp mache oder das ganze auf einen unabhängigen (lokalen) server teste.