Avatar billede obhat Nybegynder
06. januar 2007 - 13:10 Der er 23 kommentarer

Paging med MySql og ASP

Nogen der kan forklare mig om denne form for paging er god eller dårlig om man vil?

Jeg spørger fordi jeg synes den er langsom og belaster min MySql / PC meget ved paging, der er godt 1 mill. poster i databasen, men det burde vel ikke være et problem?

*Jeg har tilføjet diverse tabeller til index.

<%
pageSize = 10
currentPage = 0
if isnumeric(Request.querystring("Page")&"") then currentPage = cInt(Request.querystring("Page"))

Set rs = Conn.Execute("SELECT * FROM data WHERE bruger = '"&replace(session("bruger"), "'", "''")&"' ORDER BY ID DESC LIMIT "& currentPage &","& pageSize &"")
%>
Avatar billede jensgram Nybegynder
06. januar 2007 - 13:17 #1
Forudsat, at ID er nøgle eller du har et indeks derpå, ser løsningen fin ud, skulle jeg mene.
Avatar billede obhat Nybegynder
06. januar 2007 - 13:34 #2
Jo, id er nøgle og der er index på bruger.
Men dette script gemmenløber/counter alle 1 mill. poster hver gang siden hentes, kan det ikke gøres mere skånsomt og mindre belastende?
Avatar billede jensgram Nybegynder
06. januar 2007 - 13:50 #3
Der er da ikke noget count i det du viser dér...
Avatar billede jensgram Nybegynder
06. januar 2007 - 13:50 #4
Man må formode, at LIMIT er implementeret så den er mindst belastende.
Avatar billede punnishment Nybegynder
06. januar 2007 - 14:00 #5
Hvis ikke du bruger alle kolonner i tabellen data, så husk at erstatte * med navnene, det burde give en mindre belastning
Avatar billede jensgram Nybegynder
06. januar 2007 - 14:02 #6
punnishment > Jep! Generelt mener jeg, at man kun skal spørge efter det man skal bruge og desuden lade databasen foretage så meget databehandling som muligt (frem for ASP, PHP etc.).
Avatar billede obhat Nybegynder
06. januar 2007 - 14:03 #7
Min count del er følgende:

<%
if currentPage > 0 then
%>
<a href="side.asp?page=<%= currentPage-pageSize %>">næste</a>
<%
end if
set rs = conn.execute("select count(*) from data WHERE bruger = '"&replace(session("bruger"), "'", "''")&"'")
if not rs.eof then
if isnumeric(rs(0)&"") then
if rs(0) > currentPage+pageSize then
%>
<a href="side.asp?page=<%= currentPage+pageSize %>">forrige</a>
<%
end if
end if
end if
%>
Avatar billede arne_v Ekspert
06. januar 2007 - 18:35 #8
det er formentlig en optimal måde at gøre det på hvis du prioriterer performance

du skal være opmærksom på at metoden ikke er særlig god til at håndtere
data der bliver ændret mens man "bladrer" gennem data
Avatar billede obhat Nybegynder
06. januar 2007 - 19:04 #9
Hvad gør jeg rent praktisk? du nævner at prioriterer performance.
Avatar billede jensgram Nybegynder
07. januar 2007 - 10:22 #10
Arne V > Bliver COUNT(*) behandlet specielt af DBMS eller vil der være en fordel i COUNT(id), hvor id er nøgle eller blot indekseret?

Undskyld "spam", obhat.
Avatar billede arne_v Ekspert
07. januar 2007 - 15:47 #11
obhat>

jeg siger bare at LIMIT n,m formentligt er så optimeret som det kan blive
performance mæssigt

og at problemet er i konsistens af resultater

det vil ikke gennemløbe alle rækker hvis der er index på det du tester
på i WHERE

så din kode i spørgsmålet ser fornuftigt ud performance mæssigt

jeg ved ikke helt med din count, måske skulle du hente m+1 og ikke vise
den sidste men bruge eksistensen af den til at beslutte dig for om der er
en next page
Avatar billede arne_v Ekspert
07. januar 2007 - 15:50 #12
jensgram>

forskellen på COUNT(*) og COUNT(felt) er at den første tæller alle række mens
den anden kun tæller rækker hvor felt ikke er NULL

hvis felt er primary key så kan den ikke være NULL og derfor vil de returnere
det samme

hvorvidt MySQL internt laver dem på samme måde således at performance er
ens ved jeg ikke
Avatar billede jensgram Nybegynder
07. januar 2007 - 15:52 #13
Arne > Ok - det med NULL var jeg vist ikke klar over, men som du også siger, vil det ikke gøre forskel ved primærnøgler.

Kunne man evt. gøre noget lign.

SELECT *, (id = MAX(id)) AS lastEntry ...

og så teste, om lastEntry var TRUE (i.e. den sidste)?

Aner ikke om det er valid SQL.
Avatar billede arne_v Ekspert
07. januar 2007 - 16:01 #14
en nyere MySQL burde kunne:

SELECT *, (id = (SELECT MAX(id) FROM ..)) AS lastEntry ...

men den tror jeg ikke på performance mæssigt
Avatar billede jensgram Nybegynder
07. januar 2007 - 16:10 #15
Arne > Nej, det har du nok ret i. Bare en strøtanke :P
Avatar billede punnishment Nybegynder
07. januar 2007 - 21:06 #16
mens vi har fat i det med perfomance...

hvor sløv er den her? Dette er blot et simpelt eksempel, hvor jeg har en tabel med bruger oplysninger, også en tabel med bil oplysninger på de biler en bruger eksempelvis ejer. I nogle af mine løsninger er data-opdelingen så stor, at jeg tit skal have fat i 3-4 tabeller for at få et simpelt udtræk. Pladsmæssigt i databasen er dette jo den mest optimale måde, men hvordan hænger det sammen med perfomance?

SQL = "SELECT bil.navn, bil.pris, bil.kobt, users.username FROM users, bil WHERE users.id = bil.userid"
Avatar billede arne_v Ekspert
07. januar 2007 - 22:52 #17
hvis der er index på users.id og bil.userid så bør den være helt fin
Avatar billede punnishment Nybegynder
08. januar 2007 - 17:39 #18
yes det er der! Der er mange der benytter metoder som INNER JOIN, INNER LEFT/RIGHT osv., og det de funktiner stortset gør, er at sammensmelte to tabeller til en "fiktiv" tabel, som du kan trække oplysninger udfra. Det er jo ligepræcis det jeg gør ved ovenstående metode, men hvad er at fortrække? At bruge JOIN eller den metode jeg bruger (ved ikke lige hvad den hedder) ?
Avatar billede arne_v Ekspert
08. januar 2007 - 18:18 #19
den syntax er en join bare i den gamle SQL syntax

jeg vil forvente samme performance for joins uanset om det den gamle eller den nye syntax

men jeg har ikke maalt
Avatar billede arne_v Ekspert
17. marts 2007 - 21:22 #20
obhat ?
Avatar billede arne_v Ekspert
17. juni 2007 - 05:26 #21
??
Avatar billede obhat Nybegynder
18. august 2007 - 09:02 #22
svar..
Avatar billede jensgram Nybegynder
18. august 2007 - 10:41 #23
Hvem?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester