Avatar billede SilenceWar Nybegynder
31. marts 2011 - 21:28 Der er 20 kommentarer og
1 løsning

Mindre kode - Langsommere side

Hej eksperter..

Hm.. Som I kan se i min overskrift, så har jeg et problem - og jeg har brug for et råd til denne her..

Jeg har i løbet af de sidste par dage skrevet en hel del kode om for, at slippe for nogle dumme fejl..

Jeg gættede på forskellige ting med disse fejl der kom op - og gjorde derfor dette ved de forskellige koder:

Rykket sammen på SQL-UPDATE strings, således at 6 forskellige over 1000 linier resulterede i blot 1 SQL-UPDATE.

Ændret således at mine requests fra databasen er blevet en anelse minimeret - ved fx at sætte databaseværdier i en variabel og benyttet denne variable nedefter SELECTen..

Lavet én ny connection blot til denne side
(jeg har fx brugt net.execute til hele sitet, men Conn.execute til selve dette kæmpe opdateringsdokument)

Det er sådan set det jeg har gjort som standard - blot for at løse en fejl.

Mine koder består i koder som:

30-40 gange Split() med tilhørende fx:

raastoflager = split(raastoflagervalue, ",")
lager = raastoflager(VÆRDI FRA DB)

Derudover består koderne nu også af diverse UPDATE-strings (omkring 6 stadig)..



Jeg har prøvet at rykke rundt på en masse her til aften og været virkelig frustreret over, at en opdatering kan gå fra 3-6 sekunder til 20-60 sekunder......
Jeg forstår det virkelig ikke, eftersom jeg jo har gjort koden mindre..




Ethvert forslag vil jeg være taknemmelig for!


Hilsen
SilenceWar
Avatar billede softspot Forsker
31. marts 2011 - 21:44 #1
Kan du vise noget konkret kode (optimalt set, de passager der performer dårligt)?
Avatar billede SilenceWar Nybegynder
31. marts 2011 - 21:52 #2
Jeg kan ligge 3 eksempler ind, men det er ret meget kode - håber ikke det tager livet af dig blot at kigge på.
Eksemplerne er de koder jeg forventer der er fejl i - eftersom det er de eneste nye koder.


Eksempel 1:

set farm = Conn.execute("SELECT * FROM farmpladser WHERE verden=1")
if farm.eof or farm.bof then
else

PaladsValue = farm("palads")
ColosseumValue = farm("colosseum")
VaabensmedValue = farm("vaabensmed")
StaldValue = farm("stald")
ForsamlingspladsValue = farm("forsamlingsplads")
HandelspladsValue = farm("handelsplads")
MineValue = farm("miner")
GemmestedValue = farm("gemmested")
BymurValue = farm("bymur")
TempelValue = farm("tempel")

PaladsValue2 = TheCity("palads")
ColosseumValue2 = TheCity("colosseum")
VaabensmedValue2 = TheCity("vaabensmed")
StaldValue2 = TheCity("stald")
ForsamlingspladsValue2 = TheCity("forsamlingsplads")
HandelspladsValue2 = TheCity("handelsplads")
Skovhugger2 = TheCity("skovhugger")
Stenmine2 = TheCity("stenmine")
Jernmine2 = TheCity("jernmine")
Landejendom2 = TheCity("landejendom")
Raastoflager2 = TheCity("raastoflager")
GemmestedValue2 = TheCity("gemmested")
BymurValue2 = TheCity("bymur")
TempelValue2 = TheCity("tempel")

PaladsAryWords = Split(PaladsValue, ",")
ColosseumAryWords = Split(ColosseumValue, ",")
VaabensmedAryWords = Split(VaabensmedValue, ",")
StaldAryWords = Split(StaldValue, ",")
ForsamlingspladsAryWords = Split(ForsamlingspladsValue, ",")
HandelspladsAryWords = Split(HandelspladsValue, ",")
MineAryWords = Split(MineValue, ",")
GemmestedAryWords = Split(GemmestedValue, ",")
BymurAryWords = Split(BymurValue, ",")
TempelAryWords = Split(TempelValue, ",")

PaladsFarm = PaladsAryWords(PaladsValue2)
ColosseumFarm = ColosseumAryWords(ColosseumValue2)
VaabensmedFarm = VaabensmedAryWords(VaabensmedValue2)
StaldFarm = StaldAryWords(StaldValue2)
ForsamlingspladsFarm = ForsamlingspladsAryWords(ForsamlingspladsValue2)
HandelspladsFarm = HandelspladsAryWords(HandelspladsValue2)
SkovhuggerFarm = MineAryWords(Skovhugger2)
StenmineFarm = MineAryWords(Stenmine2)
JernmineFarm = MineAryWords(Jernmine2)
GemmestedFarm = GemmestedAryWords(GemmestedValue2)
BymurFarm = BymurAryWords(BymurValue2)
TempelFarm = TempelAryWords(TempelValue2)

TroppeFarm = int(TheCity("gladiuskrigere")) + int(TheCity("spydkastere")) + int((int(TheCity("gladiatorer")) * 5)) + int(TheCity("auxilaris")) + int((int(TheCity("praest")) * 150)) + int((int(TheCity("ballista")) * 7)) + int((int(TheCity("spioner")) * 2)) + int((int(TheCity("rambukke")) * 4)) + int((int(TheCity("kavalerister")) * 5)) + int(TheCity("berserker"))

end if


Eksempel 2: ( det kan godt ligne en mærkelig kode - men den er lavet til, at beregne råstoffer i et browserspil ;) )

<script language=javascript runat=server>
    var dt = new Date();
    var ms = dt.getMilliseconds();
</script>
<%
' Opstil de oplysninger der skal bruges til Træ-Råstof
WoodPrHour = TheCity("traetime")

SecondsToWoodResult = 3600 / WoodPrHour
SecondsToWood = int(SecondsToWoodResult)
MSToWood = SecondsToWoodResult-SecondsToWood

TraeTid = TheCity("traetid")
TraeMS = TheCity("traems")

NowTid = now()
NowMS = ms
' Beregning af millisekunder-Træ og sekunder-Træ

TraeForskelSeconds = datediff("s", TraeTid,NowTid)

TraeForskelMS = NowMS - TraeMS

if TraeForskelMS < 0 then
TraeForskelSeconds = TraeForskelSeconds + 1

TraeForskelMS = TraeForskelMS + 1000
end if 

' Beregning til hvor mange stykker træ byen skal have!

TraeBeregningMS = TraeForskelMS - MSToWood

if TraeBeregningMS < 0 then
SecondsToWood = SecondsToWood + 1

TraeBeregningMS = TraeBeregningMS + 1000
end if

AntalTrae = TraeForskelSeconds / SecondsToWood
AntalTrae = int(AntalTrae)

if AntalTrae >= 1 then
TraeForskelSeconds = datediff("s", TraeTid,NowTid)

TraeForskelMS = NowMS - (TraeMS * AntalTrae)

do while TraeForskelMS < 0

TraeForskelSeconds = TraeForskelSeconds + 1

TraeForskelMS = TraeForskelMS + 1000

loop


TraeBeregningMS = TraeForskelMS - (MSToWood * AntalTrae)
AntalSeconds = 0
do while TraeBeregningMS < 0
AntalSeconds = AntalSeconds + 1

SecondsToWood = SecondsToWood + 1

TraeBeregningMS = TraeBeregningMS + 1000

loop

SecondsToTheWoodResult = 3600 / WoodPrHour
SecondsToTheWood = int(SecondsToTheWoodResult)
MSToTheWood = SecondsToTheWoodResult-SecondsToTheWood

TidNy = SecondsToTheWood * AntalTrae

t = dateadd("s", TidNy,TraeTid)

TraeTiden = Year(t) & "-" & Right("0" & Month(t),2) & "-" & Right("0" & Day(t),2) & " " & Right("0" & Hour(t),2) & ":" & Right("0" & Minute(t),2) & ":" & Right("0" & Second(t),2)

MSTraeNY = (MSToTheWood * AntalTrae)-AntalSeconds
TraeEt = int(TheCity("trae")) + int(AntalTrae)

Resultat = TraeEt - TheCity("lager")
if Resultat > 0 then
TraeEt = TheCity("lager")
end if
else
t = TheCity("traetid")
TraeTiden = Year(t) & "-" & Right("0" & Month(t),2) & "-" & Right("0" & Day(t),2) & " " & Right("0" & Hour(t),2) & ":" & Right("0" & Minute(t),2) & ":" & Right("0" & Second(t),2)
MSTraeNY = TheCity("traems")
TraeEt = TheCity("trae")
end if 
%>

Eksempel 3:

<!--  Opdater/Check om pointene matcher bygninger i byen  -->

<%
set point = Conn.execute("SELECT * FROM pointtabel WHERE verden=1")
if point.eof or point.bof then
else

PaladsPoint = "0,45,54,63,72,81,90,99,108,117,126,135,144,153,162,171,180,189,198,207,216,225,234,243,252,261,270,279,288,297,306,315,324,333,342,351"
SplitPalads = split(PaladsPoint, ",")
pointpalads = SplitPalads(PaladsValue2)

ColosseumPoint = "0,24,30,33,39,42,48,54,57,63,66,72,78,81,87,90,96,102,105,111,114,120,126,129,135,138,144,150,153,159,162,168,174,177,183,186,192,198,201,207,210"
SplitColosseum = split(ColosseumPoint, ",")
pointcolosseum = SplitColosseum(ColosseumValue2)

VaabensmedPoint = "0,60,72,84,96,108,120,132,144,156,168,180,192,204,216,228,240,252,264,276,288,300,312,324,336,348,360,372,384,396,408"
SplitVaabensmed = split(VaabensmedPoint, ",")
pointvaabensmed = SplitVaabensmed(VaabensmedValue2) 

StaldPoint = "0,75,90,105,120,135,150,165,180,195,210,225,240,255,270,285,300,315,330,345,360,375,390,405,420,435"
SplitStald = split(StaldPoint, ",")
pointstald = SplitStald(StaldValue2)

HandelspladsPoint = "0,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87"
SplitHandelsplads = split(HandelspladsPoint, ",")
pointhandelsplads = SplitHandelsplads(HandelspladsValue2)

ForsamlingspladsPoint = "0,18,256"
SplitForsamlingsplads = split(ForsamlingspladsPoint, ",")
pointforsamlingsplads = SplitForsamlingsplads(ForsamlingspladsValue2)

TempelPoint = "0,400"
SplitTempel = split(TempelPoint, ",")
pointtempel = SplitTempel(TempelValue2)

SkovhuggerPoint = "0,12,15,18,18,21,24,27,30,30,33,36,39,42,42,45,48,51,54,54,57,60,63,66,66,69,72,75,78,78,81,84,87,90,90,93"
SplitSkovhugger = split(SkovhuggerPoint, ",")
pointskovhugger = SplitSkovhugger(Skovhugger2)

StenminePoint = "0,12,15,18,18,21,24,27,30,30,33,36,39,42,42,45,48,51,54,54,57,60,63,66,66,69,72,75,78,78,81,84,87,90,90,93"
SplitStenmine = split(StenminePoint, ",")
pointstenmine = SplitStenmine(Stenmine2)

JernminePoint = "0,12,15,18,18,21,24,27,30,30,33,36,39,42,42,45,48,51,54,54,57,60,63,66,66,69,72,75,78,78,81,84,87,90,90,93"
SplitJernmine = split(JernminePoint, ",")
pointjernmine = SplitJernmine(Jernmine2)

LandejendomPoint = "0,18,21,24,30,33,36,39,42,48,51,54,57,60,66,69,72,75,78,84,87,90,93,96,102,105,108,111,114,120,123"
SplitLandejendom = split(LandejendomPoint, ",")
pointlandejendom = SplitLandejendom(Landejendom2)

RaastoflagerPoint = "0,15,18,21,24,27,30,33,36,39,42,45,48,51,54,57,60,63,66,69,72,75,78,81,84,87"
SplitRaastoflager = split(RaastoflagerPoint, ",")
pointraastoflager = SplitRaastoflager(Raastoflager2)

GemmestedPoint = "0,9,12,12,15,15,18,21,21,24,24,27,30,30,33,33"
SplitGemmested = split(GemmestedPoint, ",")
pointgemmested = SplitGemmested(GemmestedValue2)

BymurPoint = "0,30,36,42,48,54,60,66,72,78,84,90,96,102,108,114,120,126,132,138,144,150,156,162,168,174"
SplitBymur = split(BymurPoint, ",")
pointbymur = SplitBymur(BymurValue2)

end if
%>
<%
totalpoint = int(pointpalads) + int(pointcolosseum) + int(pointvaabensmed) + int(pointstald) + int(pointhandelsplads) + int(pointskovhugger) + int(pointstenmine) + int(pointjernmine) + int(pointraastoflager) + int(pointgemmested) + int(pointbymur) + int(pointlandejendom) + int(pointforsamlingsplads) + int(pointtempel)
%>

<%
set bygnings = Conn.execute("SELECT * FROM bygninger WHERE verden=1")
if bygnings.eof or bygnings.bof then
else

' Så meget skjuler Gemmestedet!
GemmestedSplit = "0,100,150,200,250,300,375,450,525,600,800,1000,1200,1400,1600,2000"
SplitGemmested = split(GemmestedSplit, ",")
hiding = SplitGemmested(GemmestedValue2)

' Så meget træ!
SkovhuggerSplit = "24,36,42,48,54,66,72,84,96,108,126,144,168,186,216,252,288,330,378,432,498,576,660,756,870,1002,1152,1326,1524,1752,2016,2316,2664,3066,3522,4200 "
SplitSkovhugger = split(SkovhuggerSplit, ",")
traetime = SplitSkovhugger(Skovhugger2)

' Så meget sten!
StenmineSplit = "24,36,42,48,54,66,72,84,96,108,126,144,168,186,216,252,288,330,378,432,498,576,660,756,870,1002,1152,1326,1524,1752,2016,2316,2664,3066,3522,4200 "
SplitStenmine = split(StenmineSplit, ",")
stentime = SplitStenmine(Stenmine2)

' Så meget jern!
JernmineSplit = "24,36,42,48,54,66,72,84,96,108,126,144,168,186,216,252,288,330,378,432,498,576,660,756,870,1002,1152,1326,1524,1752,2016,2316,2664,3066,3522,4200 "
SplitJernmine = split(JernmineSplit, ",")
jerntime = SplitJernmine(Jernmine2)

' Så mange indbyggere!
LandejendomSplit = "150,250,288,331,380,437,503,578,665,778,910,1065,1246,1458,1735,2065,2457,2924,3479,4140,4957,5863,6977,8303,9880,11758,13992,16650,19813,24464,30000 "
SplitLandejendom = split(LandejendomSplit, ",")
maxindbygger = SplitLandejendom(Landejendom2)

' Så meget lagerplads!
RaastoflagerSplit = "400,800,960,1152,1382,1659,1991,2488,3110,3888,4860,6075,7594,9492,12340,16042,20854,27111,35244,45817,61853,83501,112727,163454,245181,350000 "
SplitRaastoflager = split(RaastoflagerSplit, ",")
lagercap = SplitRaastoflager(Raastoflager2)

' Så meget bymurs beskyttelse!
BymurSplit = "0,5,9,14,17,22,26,31,38,44,49,54,60,65,71,75,79,83,86,90,93,93,102,107,110,115 "
SplitBymur = split(BymurSplit, ",")
citysafe = SplitBymur(BymurValue2)

end if
%>





Efter dette er der Update-strings ala:

if TheCity("lager") <> lagercap then
UpdateCityInfos12 = Conn.execute("UPDATE byinfo SET lager='"& lagercap &"' WHERE id='"& TheCity("id") &"'")
end if


- Jeg sagde fra starten, at jeg havde skrevet alle sammen. Men da det gik langsomt allerede der - var ét af mine forsøg, at skrive allesammen hver for sig igen. Derfor ser updaten sådan ud.




Nu håber jeg ikke du er druknet.. De mindste spørgsmål - stil dem endelig :)


SW
Avatar billede SilenceWar Nybegynder
31. marts 2011 - 21:54 #3
Forresten:

Linier som
LandejendomSplit = "150,250,288,331,380,437,503,578,665,778,910,1065,1246,1458,1735,2065,2457,2924,3479,4140,4957,5863,6977,8303

Har før været blot:

SplitLandejendom = split(bygnings("landejendom"), ",")


- Dette var igen blot et forsøg på, at mindske trafikken til og fra databasen - ved at skrive alle værdierne direkte ind i koden.
Avatar billede softspot Forsker
31. marts 2011 - 22:23 #4
De steder der spriner mest i øjnene er databasekaldende. Alt andet kode ser umiddelbart tilforladeligt ud. Derfor vil jeg anbefale at du prøver at lægge kode ind som måler tidsforbruget i forbindelse med selects og updates i databasen. Det kan du gøre ved at aflæse Timer før og efter en handling og sammenligne de to tider.

startTid = Timer
set farm = Conn.execute("SELECT * FROM farmpladser WHERE verden=1")
slutTid = Timer
Response.Write formatNumber(slutTid-startTid,4,true,false,false)

Dette vil udskrive tidsforbruget på kaldet til databasen. Denne metode kan du så benytte de forskellige steder, hvor du vil have vished om hvor lang tid koden tager.

Generelt er VBS-kode som ikke har kontakt til eksterne resurser (filer, database og andre enheder) hurtigt nok, så det er de steder hvor bruger eksterne resurser du først skal tjekke performance på. Andre elementer kunne være løkker som din do while-løkker (hvor den ene vist kan beregnes med lidt formeltrylleri :-)).
Avatar billede softspot Forsker
31. marts 2011 - 22:33 #5
Hvilken database benytter du i øvrigt?
Avatar billede SilenceWar Nybegynder
31. marts 2011 - 22:39 #6
Jeg vil lige prøve det med Timer start/slut..

Hvilket do while-løkke hentyder du til?

Jeg benytter med af en MySQL database.
Avatar billede SilenceWar Nybegynder
31. marts 2011 - 22:50 #7
Tak du! :)

Jeg aner ikke om jeg har gjort noget - men jeg har fundet ud af, at der var maks 0,015 forsinkelse mellem mine requests..

Derudover midt i testen endte det self. med, at tempoet kom og og køre igen.

Tusind tak fordi du gad kigge på koden - om ikke andet fordi du sagde det da i det mindste ser tilforladeligt ud ;)

Skriv et svar og få pointene ;)
Avatar billede SilenceWar Nybegynder
31. marts 2011 - 22:51 #8
- Den sidste besked trækker jeg lige lidt i land med :(

Det var åbentbart kun lige kort det skete :-/
Avatar billede SilenceWar Nybegynder
31. marts 2011 - 23:00 #9
Hele min kode tager omkring 0,6 sekund i gennemsnit pr. landsby...

Det vil sige, at det bare vil blive langsommere og langsommere..

Jeg har 47 spillere lige nu - det vil sige 47*0,6 = 28,2 sekunder..


Hm.. Er der noget man kan gøre ved, at det tager længere og længere tid??
Evt. en anden metode til, at få alle byerne opdateret??

Hvis jeg fx. får 100 brugere så er det 60 sekunder som minimum...
Det er slet ikke holdbart.

Har du nogle forslag?
Avatar billede softspot Forsker
31. marts 2011 - 23:08 #10
For at kunne forholde mig til hvad der rent lavpraktisk kan gøres er jeg nød til at vide lidt mere om databasestrukturen og forventede datamængder i de forskellige tabeller.

Generelt set kunne det dog godt lyde som om du mangler nogle indeks eller at de skal justeres lidt ifht. brugen af tabellerne. Du kan evt. overveje at splitte tabellerne op på en anden måde, således de opdateringstunge tabeller har få indeks og de læsningstunge tabeller har mange indeks (at noget er "tungt" betyder her blot, at det er den handling der udføres mest :-)).

Jeg er slet ikke ekspert i MySQL, så jeg kan ikke give dig præcise vejledninger til hvordan du gør disse ting i praksis, men principperne kan jeg nok hjælpe lidt med.
Avatar billede softspot Forsker
31. marts 2011 - 23:36 #11
De løkker jeg snakker om er

do while TraeForskelMS < 0
  TraeForskelSeconds = TraeForskelSeconds + 1
  TraeForskelMS = TraeForskelMS + 1000
loop

og

do while TraeBeregningMS < 0
  AntalSeconds = AntalSeconds + 1
  SecondsToWood = SecondsToWood + 1
  TraeBeregningMS = TraeBeregningMS + 1000
loop

Hvor jeg vil mene at du må kunne klare det ved at dividere negativ TraeBeregningMS/TraeForskelMS med 1000 og blot lægge resultatet til de respektive variable (med lidt justeringer for rest). Men alt andet lige er det noget som kun skal udføres én gang i modsætning til løkken der i teorien kan risikere at skulle køre mange gange (og dermed være en variabel omkostning for CPU'en).

Jeg forestiller mig noget i stil med dette:

diff = int(-TraeBeregningMS / 1000)
rest = -TraeBeregningMS mod 1000
faktor = diff
if rest > 0 then
  faktor = faktor + 1
end if
AntalSeconds = AntalSeconds + diff
SecondsToWood = SecondsToWood  + diff
TraeBeregningMS = faktor * 1000

og det samme vil gøre sig gældende for den anden løkke...

Jeg er klar over at dette er flueknepperi ifht. de tidsmæssige omkostninger der er forbundet med dine databasekald, men ikke desto mindre, så burde dette performe bedre end løkkeløsningen. Hvis du vil have vished, kan du jo performaceteste de to løsninger... :-)
Avatar billede SilenceWar Nybegynder
31. marts 2011 - 23:43 #12
Vil meget gerne fortælle omkring min databaseopsætning.
Men.. (der er altid et men :-( )

Når du skriver, at du gerne vil vide lidt om mine indeks, hvad mener du så?

Hvad det er? Såsom Varchar, INT, Longtext, DateTime osv.?

Det med, at kigge på dit forslag vil jeg gerne lige have lov at vente lidt med til i morgen formiddag hvor jeg ikke er så træt i hovedet :)

Tak for hjælpen indtil videre ;)


btw, ville en opgradering af webhotellet samtidig kunne hjælpe betydeligt - eller er det kun små marginer.?

Hilsen
SW
Avatar billede softspot Forsker
31. marts 2011 - 23:48 #13
Mht. dine updates kan du måske med MySQL samle flere SQL-sætninger i samme kald til databasen og dermed skære ned på det overhead der er i at skulle kalde databasen fra ASP. Således du ender med en SQL der ser nogenlunde sådan her ud (det er kun et eksempel på strengens indhold jeg viser her):

UPDATE byinfo SET lager='lagercap1' WHERE id='1';
UPDATE byinfo SET lager='lagercap2' WHERE id='2';
UPDATE byinfo SET lager='lagercap3' WHERE id='3';
UPDATE byinfo SET lager='lagercap4' WHERE id='4';
UPDATE byinfo SET lager='lagercap5' WHERE id='5';

Så kan du kalde din database med indholdet af hele denne streng og dered udføre 5 updates på én gang (set fra VBScript i det mindste :-))

Conn.Execute SQLSamletUpdate

hvor SQLSamletUpdate indeholder alle de updates der skal laves, som vist ovenfor,,,
Avatar billede softspot Forsker
01. april 2011 - 00:00 #14
Indeks er støttetabeller til tabeller som gør at en tabel er hurtigere at slå op i. Indeks kan fint sammenlignes med det du finder bag i en bog, hvor du ud fra et ord kan finde de sider i bogen ordet forekommer.

Udfordringen med indeks (i databaser) er, at man på tabeller der opdateres meget skal have så få indeks som muligt, da indeks typisk genopbygges, når nye data lægges i eller data i den indekserede tabel opdateres. Derfor er det ikke performancemæssigt optimalt, at have mange indeks på tabeller som opdateres meget. På den anden side er det godt at have gode indeks på tabeller der læses meget fra, da databasen så hurtigere kan finde data.

Den tekniske funktion af databaser er et større kapitel (eller mange store kapitler ;-)), men det er helt sikkert værd at undersøge emnet indeks, hvis du skal arbejde med (datamæssigt) store tabeller, da det kan forøge performance betydeligt med nogle velplacerede indeks.

Først skal du dog nok lige have klarlagt, hvor dit problem rent faktisk opstår i koden. Desuden kan du jo evt. prøve det med BULK-opdatering, jeg var inde på i det forrige indlæg...
Avatar billede softspot Forsker
01. april 2011 - 00:11 #15
Når jeg efterspørger databasestrukturen, er det hvilke tabeller du har, hvilke felter hver tabel indeholder og hvordan tabellerne er bundet sammen (hvilke felter peger på andre tabeller og hvilket felt i de andre tabeller er nøglen der binder tabellerne sammen).

Eksempelvis kunne datamodel for en forretnings ordresystem indeholde følgende tabeller, felter og referencer:

Kunde =
    id
  + navn

Ordre =
    id
  + kundeid
  + dato

Ordrelinje =
    id
  + ordreid
  + vare
  + pris

En ordrelinje er knyttet til en ordre via ordrens id (Ordrelinje.ordreid) og en ordre er knyttet til en kunde via kundens id (Ordre.kundeid).

Det er altså noget i stil med ovenstående eksempel jeg har brug for fra dig, for at få en idé om hvordan din databasestruktur er bygget op.
Avatar billede softspot Forsker
01. april 2011 - 00:15 #16
Jeg har ikke noget overblik over hvilke muligheder du har for opgradering af webhotel, men typisk kan der hentes meget ud af ganske lidt på en MySQL (har jeg hørt), så jeg ville personligt forsøge at optimere koden og databasen inden jeg kastede flere penge efter "mere hardware" ;-)
Avatar billede softspot Forsker
07. april 2011 - 18:06 #17
Kom du videre med dette?
Avatar billede SilenceWar Nybegynder
12. april 2011 - 22:01 #18
Hejsa,

Mange gange undskyld pga. mit manglende svar de sidste 12 dage :s
- Men har haft ekstremt meget at se til den seneste tid.


For at komme lidt tilbage til det vi snakkede om, så var det med den indekserede database sådan set det jeg slet ikke kunne komme frem til en metode ved..

Altså, du skriver det er støttetabeller og du nævnte også tidligere, at ved de tabeller i databasen der bliver opdateret meget tit - skulle der være få indeks til? og omvendt self. (eller tager jeg fejl? :))

Men.. Når jeg logger ind på min PHPMyAdmin MySQL database, så synes jeg ikke, at kunne finde noget der kan lede mig på rette vej - og gætter ikke på, at jeg skal oprette endnu mere inde i databasen for at gøre den hurtigere.? :)

Har du et foreslag til hvordan jeg kan komme godt igang med indekseringen.? :)

SW
Avatar billede softspot Forsker
13. april 2011 - 08:21 #19
Jeg har ikke nogen erfaring med phpmyadmin, men i SQL Server Management Console skal man højreklikke på tabellen og specificere indeks for tabellen.

Indeks er som sådan ikke noget du ser i tabeloversigten (ikke i SQL Server i det mindste), så det er måske ikke så let at gennemskue om der er indeks og hvilke der er, hvis du ikke er helt fortrolig med dit administrationssystem. Jeg er dog ret overbevist om at der findes nogle kommandoer i phpmyadmin som giver dig rapporter vedr. indeks (og alle andre forhold vedr. din database for den sags skyld).

Det kunne være du skal Google lidt (eller kigge i phpmyadmin's hjælp) for at se om du kan finde noget vedr. dette emne.

Det er i det mindste, iflg. min opfattelse, sådan på SQL Server, at jo flere indeks der er knyttet til en tabel, desto mere er der for databasen at reindeksere, når tabellen bliver opdateret. Jeg antager derfor, at det forholder sig på samme måde i en MySQL-database. Det kan være du kan poste denne del af dit spørgsmål i en anden gruppe her på Eksperten (jeg ved ikke om der er en specifik gruppe ril MySQL).
Avatar billede SilenceWar Nybegynder
13. april 2011 - 19:52 #20
Ved du hvad, det gør jeg da bare :)

Lig et svar, pointene fra dette spørgsmål er dine.
Avatar billede softspot Forsker
13. april 2011 - 21:22 #21
Velbekomme :-)

Skulle der efter optimering af databasen stadig være problemer med performance i scriptkoden vender du blot tilbage, så skal jeg se om jeg kan hjælpe :-)
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
Kurser inden for grundlæggende programmering

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