/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
meget store result set i mySQL
Fra : Dennis Eskildsen


Dato : 18-10-01 08:39

Hej gruppe

Jeg har en mySQL tabel der indeholder over 17.000 poster. Jeg vil gerne have
dem alle sammen vist, men kun 25 af gangen.
Det troede jeg var til at overkomme ved at sætte en limit på 25, på min
select query. Førse gang jeg kører dette query tager det imidlertid en krig
at få den til at vise noget, men de efterfølgende kørsler, som skal vise
25-50, 50-75 osv., giver resultat med det samme.
Jeg syntes det er ret underligt da jeg har lavet et index på tabellen,
således at posterne ligger i den rækkefølge jeg vil have dem vist i.

Håber der er nogle der har prøvet noget lignende, eller har en ide til hvad
jeg skal gøre.

På forhånd tak
Dennis



 
 
Christian Schmidt (18-10-2001)
Kommentar
Fra : Christian Schmidt


Dato : 18-10-01 16:04

Dennis Eskildsen wrote:
>
> Jeg har en mySQL tabel der indeholder over 17.000 poster. Jeg vil gerne have
> dem alle sammen vist, men kun 25 af gangen.
> Det troede jeg var til at overkomme ved at sætte en limit på 25, på min
> select query. Førse gang jeg kører dette query tager det imidlertid en krig
> at få den til at vise noget, men de efterfølgende kørsler, som skal vise
> 25-50, 50-75 osv., giver resultat med det samme.
> Jeg syntes det er ret underligt da jeg har lavet et index på tabellen,
> således at posterne ligger i den rækkefølge jeg vil have dem vist i.

Må vi se din tabel ("DESC tabelnavn") og din SQL?


Christian

Dennis Eskildsen (19-10-2001)
Kommentar
Fra : Dennis Eskildsen


Dato : 19-10-01 11:58

"Christian Schmidt" <christian@schmidt.net> wrote in message
news:<3BCEEF67.3BBC0BDF@schmidt.net>...
> Dennis Eskildsen wrote:

> Må vi se din tabel ("DESC tabelnavn") og din SQL?

Det kan I tro I må.

Her er select sætningen:
select i.message_id, g.gruppenavn, i.subject, i.dato, i.sender, i.reference
from indlaeg i, gruppe_indlaeg g where i.message_id = g.message_id and
g.gruppenavn = '$nyhed' order by dato desc limit $offset,25

Tabellerne er 'indlaeg' der er indexeret faldende efter dato og
'gruppe_indlaeg' der er indexeret efter gruppenavn

og undskyld til Christian fordi jeg kom til at sende svaret til hans email.




Christian Schmidt (20-10-2001)
Kommentar
Fra : Christian Schmidt


Dato : 20-10-01 15:12

Dennis Eskildsen wrote:
>
> "Christian Schmidt" <christian@schmidt.net> wrote in message
> news:<3BCEEF67.3BBC0BDF@schmidt.net>...
> > Dennis Eskildsen wrote:
>
> > Må vi se din tabel ("DESC tabelnavn") og din SQL?
>
> Det kan I tro I må.
>
> Her er select sætningen:
> select i.message_id, g.gruppenavn, i.subject, i.dato, i.sender, i.reference
> from indlaeg i, gruppe_indlaeg g where i.message_id = g.message_id and
> g.gruppenavn = '$nyhed' order by dato desc limit $offset,25
>
> Tabellerne er 'indlaeg' der er indexeret faldende efter dato og
> 'gruppe_indlaeg' der er indexeret efter gruppenavn

Hvor indekserer man faldende?


Jeg antager, at message_id er primærnøgle i indlæg-tabellen? Hvad siger
en explain (skriv explain foran din query, dvs. "explain select
i.message_id, ...")?

Måske kan der være en fidus i at joine tabellerne i en anden rækkefælge.
Prøv at bruge STRAIGHT_JOIN og så bytte om på tabellernes rækkefølge
efter "from" (dvs. skriv gruppe_indlaeg før indlæg). Hvis du skriver
indlaeg først, skal du også oprette et index på message_id i tabellen
gruppe_indlaeg.


> og undskyld til Christian fordi jeg kom til at sende svaret til hans email.

Alt forladt.


Christian

Dennis Eskildsen (21-10-2001)
Kommentar
Fra : Dennis Eskildsen


Dato : 21-10-01 16:26


"Christian Schmidt" <christian@schmidt.net> wrote in message
news:3BD18615.23470DEB@schmidt.net...
> Dennis Eskildsen wrote:

> > Her er select sætningen:
> > select i.message_id, g.gruppenavn, i.subject, i.dato, i.sender,
i.reference
> > from indlaeg i, gruppe_indlaeg g where i.message_id = g.message_id and
> > g.gruppenavn = '$nyhed' order by dato desc limit $offset,25
> >
> > Tabellerne er 'indlaeg' der er indexeret faldende efter dato og
> > 'gruppe_indlaeg' der er indexeret efter gruppenavn

> Jeg antager, at message_id er primærnøgle i indlæg-tabellen? Hvad siger
> en explain (skriv explain foran din query, dvs. "explain select
> i.message_id, ...")?

Message_id er ganske rigtig primær nøgle.

Jeg er ikke klar over hvorledes jeg skal få explain skrevet ud. Jeg kan godt
få det når jeg bruger min egen mySQL klient, på en database på min egen
maskine.
Problemet er at den server jeg bruger til dette projekt har jeg kun adgang
til via ftp, så jeg kan oploade scripts, og kan derfor ikke få fingrene i
db-serveren.

> Måske kan der være en fidus i at joine tabellerne i en anden rækkefælge.
> Prøv at bruge STRAIGHT_JOIN og så bytte om på tabellernes rækkefølge
> efter "from" (dvs. skriv gruppe_indlaeg før indlæg). Hvis du skriver
> indlaeg først, skal du også oprette et index på message_id i tabellen
> gruppe_indlaeg.

Der lader ikke til at være det store at hente ved STRAIGHT_JOIN, jeg har
også prøvet SELECT DISTINCT og med sql_big_result uden resultat.
Ved SELECT DISTINCT lader det til at den ikke cacher de næste poster, udover
de 25 der skal vises, men kørslen er kke mærkbart hurtigere.

Dennis



Christian Schmidt (21-10-2001)
Kommentar
Fra : Christian Schmidt


Dato : 21-10-01 19:48

Dennis Eskildsen wrote:
>
> Jeg er ikke klar over hvorledes jeg skal få explain skrevet ud. Jeg kan godt
> få det når jeg bruger min egen mySQL klient, på en database på min egen
> maskine.
> Problemet er at den server jeg bruger til dette projekt har jeg kun adgang
> til via ftp, så jeg kan oploade scripts, og kan derfor ikke få fingrene i
> db-serveren.

Prøv noget i retning af dette:

$rs = mysql_query("EXPLAIN SELECT * FROM ...");
while ($row = mysql_fetch_array($rs)) {
   var_dump($row);
}


Outputtet herfra kan gøres mere læseligt efter behov.

Alternativt kan du installere phpMyAdmin og bruge den til at lave
EXPLAIN med.


Christian

Dennis Eskildsen (24-10-2001)
Kommentar
Fra : Dennis Eskildsen


Dato : 24-10-01 08:12


"Christian Schmidt" <christian@schmidt.net> wrote in message
news:3BD31855.A4C00916@schmidt.net...
> Dennis Eskildsen wrote:
> >
> > Jeg er ikke klar over hvorledes jeg skal få explain skrevet ud. Jeg kan
godt
> > få det når jeg bruger min egen mySQL klient, på en database på min egen
> > maskine.
> > Problemet er at den server jeg bruger til dette projekt har jeg kun
adgang
> > til via ftp, så jeg kan oploade scripts, og kan derfor ikke få fingrene
i
> > db-serveren.
>
> Prøv noget i retning af dette:
>
> $rs = mysql_query("EXPLAIN SELECT * FROM ...");
> while ($row = mysql_fetch_array($rs)) {
> var_dump($row);
> }

Så fik jeg explain skrevet ud, uden dog at blive vanvittig meget klogere af
det.
Men jeg gjorde det, at jeg smed et autoincrement felt ind i 'indlaeg'
tabellen som primær nøgle og indekserede på det. Det fungerede temmelig godt
med en straight join. Så nu går det relativt hurtigt.
Det giver vel også mere mening at indeksere efter en primærnøgle, end som
før efter datoen, som jo ikke fandtes i den tabel der skulle joines med.
Det korte af det lange er, at det åbenbart var min indeksering den var gal
med.

Jeg siger mange tak for hjælpen
Dennis



Peter Brodersen (18-10-2001)
Kommentar
Fra : Peter Brodersen


Dato : 18-10-01 16:20

On Thu, 18 Oct 2001 09:39:21 +0200, "Dennis Eskildsen" <eske@city.dk>
wrote:

>Det troede jeg var til at overkomme ved at sætte en limit på 25, på min
>select query. Førse gang jeg kører dette query tager det imidlertid en krig
>at få den til at vise noget, men de efterfølgende kørsler, som skal vise
>25-50, 50-75 osv., giver resultat med det samme.

Hvis du fx laver en ORDER BY, skal der jo stadigvæk sorteres i de
+17.000 poster (hvorfor det er relevant med index). Derudover cache'r
MySQL resultatsæt såvidt jeg ved, så det kan tænkes at efterfølgende
queries er baseret på resultatet af den query, der netop er kørt.

I øvrigt har jeg samme spørgsmål som Christian.

--
- Peter Brodersen

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408929
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste