Avatar billede Slettet bruger
04. august 2008 - 10:03 Der er 11 kommentarer og
1 løsning

Performance og selects

Hej

Jeg ved ikke ret meget på performance fronten mht. mysql, så derfor har jeg lige et par spørgsmål. Pt har jeg en pristabel hvor jeg først har x mål samt y mål og ud fra disse bliver tabellen dannet. Derefter bliver prisen hentet via en funktion hvor i at højden og bredden udgør de faktorer der finder prisen ud fra funktionen.

Et meget simpelt eksempel.

--- 600 700 800 900
600
700
800
900

Funktionen er således at der hentes på fx 600x600 og retuneres en pris. Dette medfører således at der faktisk hentes 16 gange fra databasen ud over når tabellen oprettes, og til dette køres to selects (til en array med x værdierne samt en til y værdierne).

Et udsnit af databasen ser således ud:
ID, x, y, pris
1, 600, 600, 1100
2, 600, 700, 1200
3, 600, 800, 1300
4, 600, 900, 1400
5, 700, 600, 1200
6, 700, 700, 1300
mv...

Bemærk i øvrigt at tabellens størrelse er variabel og kan være på op til 2000.

Dette har fungeret rigtig fint til dato, men jeg har svært ved at tro at det er en helt god måde at gøre det på, eller?!?

Det kommer sig af, at der snarres vil være en meget stor aktivitet på siden og et anslået tal vil ca. være 15.000 - 25.000 unikke besøgende om mdr.

Spørgsmålet er således om det er intet problem for mysql serveren at tabellen udføres som ovenstående, eller om der er en bedre løsning?!?

Og rent performance mæssigt, hvor meget betyder det med flere selects pr. side?!? Jeg har lavet en del joins, men jeg ligger alligevel på lidt under 10 selects på en af de sider hvor det virkelig går hæftigt for sig + ovenstående tabel. Er dette helt skidt?!?

Håber I kan hjælpe.
Avatar billede erikjacobsen Ekspert
04. august 2008 - 11:19 #1
"hentes 16 gange" - hvordan kommer du op på det antal?

Jeg formoder du vil hente priser for 600x600 ved at lave en

  SELECT ... FROM ... WHERE x=600 AND y=700
Avatar billede erikjacobsen Ekspert
04. august 2008 - 11:21 #2
hehe, der er 3 slags mennesker: dem der kan tælle og dem der ikke kan. Jeg mente:

SELECT ... FROM ... WHERE x=600 AND y=600
Avatar billede Slettet bruger
04. august 2008 - 11:34 #3
:)

--- 600 700 800 900
600 1, 2, 3, 4
700 5, 6, 7, 8
800 9, 10, 11, 12
900 13, 14, 15, 16

1 til 16 køres fra en loop:

for i=1 to 16

strPris = getPrice(600,600)



og getPrice er selvfølgelig som du selv beskriver: SELECT ... FROM ... WHERE x=600 AND y=600

Men det primære i spørgsmålet (som jeg nok ikke fik fremhævet ret godt) er hvor meget det kræver fra mysql serveren at der er flere selects pr. side.
Avatar billede erikjacobsen Ekspert
04. august 2008 - 12:08 #4
20.000 om måneden er 1.000 om dagen fordelt på 8 timer: 125 i timen, ca. 2 i minuttet. Det er i sig selv ingenting, selv om de ikke fordeler sig så jævnt.

Men derfor skal vi da har gjort forespørgslen så hurtig som rimeligt muligt.

Jeg kan ikke se hvad din forløkke gør godt for. Som du skriver den, kan du li'så godt:

strPris = getPrice(600,600);
for i=1 to 16 {
  ....noget med strPris...
}
Avatar billede Slettet bruger
04. august 2008 - 12:34 #5
Loop kører ud fra en array med x og y priserne:

strXarray = "600,700,800,900"
strYarray = "600,700,800,900"

Dvs jeg har en loop der først kører x rækkerne og retunere:

--- 600 700 800 900

og derefter tager jeg hver strYarray samt henter prisen fra funktionen, fx.:

--- 600 700 800 900
600 getPrice(600,600) getPrice(600,700) getPrice(600,800) getPrice(600,900)
700 getPrice(700,600) mv.

Så tror jeg at jeg fik det hele på plads :)

Hele scriptet foregår i ASP, men det er jo en helt anden diskussion :)

Ydermere er dette en MEGET lille tabel og de fleste tabeller ligger på 15x10.

Du har naturligvis ret i at det ca. er 2 pr. minut, men det er unikke besøgende, samt at dette fungere som en del af et produktkatalog hvor at dette script køres hver eneste gang der vises et produkt, så det giver forhåbentlig lidt mere end blot to forespørgsler pr. minut :)
Avatar billede erikjacobsen Ekspert
04. august 2008 - 12:51 #6
Ok, så kan jeg vist også tælle til 16.

Du skal altså bare hente det een gang.

  SELECT ... FROM ... WHERE x IN (600,700,800,900) AND y IN (600,700,800,900)

Så har du een forespørgsel, der giver 16 rækker, og det er i hvert fald hurtigere end 16. Du må så gemme det hentede i et array eller lignende i ASP, dvs. formentlig i VBScript.

Det er så måske lidt bøvlet i VBScript... Tænk engang - er der stadig nogen, der bruger gammeldags ASP?
Avatar billede Slettet bruger
04. august 2008 - 13:38 #7
Tja, bruger gammeldags ASP.

Jeg har nu fået kogt det hele ned til en select ved brugt af lidt ASP.

Men mit spørgsmål går stadig lidt på, om det er for meget at have noget der ligner måske 10 selects på en side?!? Der er tale om standard selects samt order by.
Avatar billede w13 Novice
04. august 2008 - 13:41 #8
Det kommer jo helt an på, hvor meget de henter og hvor avancerede de er. :) Og hvordan du definerer "for meget".
Avatar billede erikjacobsen Ekspert
04. august 2008 - 13:43 #9
Som udgangspunkt er det ikke for meget. Du kan som her måske gøre noget hurtigere ved at kigge lidt på det, og ved at tænke i fx indexer, og du kan (bør?) lave en balastningstest af systemet, så du ved hvad det kan holde til.
Avatar billede Slettet bruger
04. august 2008 - 14:02 #10
For meget er; hvis der er mærkbar ventetid :)

Men det glæder mig at høre, at det som udgangspunkt ikke er for meget. De SQL sætninger jeg bruger er på ingen måde avanceret.

Men som du er inde på erikjacobsen, så er jeg også ved at gennemgå alle koderne for at gøre dem bedre. Men forefindes et evt. belastningstest system allerede, eller er det blot at lave et selv?!?

I må i øvrigt gerne lave svar, for jeg tror at jeg er ved at være ved ende ved dette spørgsmål.
Avatar billede erikjacobsen Ekspert
04. august 2008 - 14:04 #11
Ingen point til mig, tak.

Der er flere belastningsprogrammer derude - også Microsoft har lavet et. Men det sidste jeg har brugt med fornøjelse er: http://curl-loader.sourceforge.net/  - det afvikles på en linux maskine, men kan selvfølgelig test ASP-sider også ;)
Avatar billede w13 Novice
04. august 2008 - 14:41 #12
Om der er mærkbar ventetid, kan du vel se ved at gå ind på siden. :o)

Men selvfølgelig; hvis du har 13.000.000 poster, kan det da godt være, at en enkel linje SQL vil kræve en lille smule ventetid. :) Så derfor er det da altid at foretrække at holde sine SQl-sætninger så simple som muligt og undgå at have for mange af dem.
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