|
| 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
| |
|
|