webForumDet fria alternativet

Snabbare programmering

10 svar · 1 350 visningar · startad av Mr T

Mr TMedlem sedan maj 20071 061 inlägg
#1

Har pillat med ett system och allt efter tiden går kommer fler ideer och med dom nya tabeller.
Sitter nu och funderar på om anropen börjar bli för långa.

(Förenklar mina tabeller för att fokusera tråden på "snabbhet" och ingen exackt lösning av mina tabeller)

[I][B]datum_meddelanden[/B][/I]
id
datum
meddelande

Gör en lop då jag vill visa en månad där jag lopar igenom alla dagar i en månad och söker om några meddelanden finns för denna dagen. Kan altså bli så mycket som 31 SQL anrop.
Går det snabbare om jag lägger resultaten i tabell/lista som sorteras av PHP (som jag använder) ?

Till saken hör att jag nu har ev. 3 tabeller till som ev. ska in.

[I][B]födelsedagar[/B][/I]
id
datum
person_id

[I][B]Göralista[/B][/I]
id
senast_datum
meddelanden

[I][B]Anteckning[/B][/I]
id
datum
person_id
meddelanden

Det kan nu bli upp till 31 dagar i månaden * 4 tabell anrop = 124st

The_HulkMedlem sedan juni 20031 837 inlägg
#2

vilket format har du på datum-fältet och vilken databasserver använder du?
Många gånger kan man ställa en fråga i stil med "WHERE YEAR(datum) = 2010 AND MONTH(datum) = 2
Det kanske kan hjälpa dig på vägen.
Då blir det bara en fråga per tabell och inte en per dag.

Mr TMedlem sedan maj 20071 061 inlägg
#3

Då jag ligger på ett hotell har jag inte typ ch versionsnummer på databasen i huvudet. Jag använder just komandona du nämner, om det besvara din fråga för nu (kan kolla version då jag sitter på hemma)

Hur menar du att "WHERE YEAR(datum) = 2010 AND MONTH(datum)=2" ska ge en fråga/tabell då jag ställer en fråga/dag ?

dAEkMedlem sedan feb. 20041 816 inlägg
#4

Jag är lite osäker på hur olika databaser hanterar frågor likt ngnFunktion(kolumn) men man brukar försöka att undvika det eftersom det ofta innebär att databasen inte kan använda index utan scannar tabellen rad för rad, vilket såklart är långsammare.

Mindre bra: select bla bla bla... where year(datum) = 2010 and month(datum) = 2
Bättre: select bla bla bla... where datum >= '2010-02-01' and datum < '2010-03-01'

De flesta databaserna idag har ganska bra funktioner för att hantera datum. Annars kan man skriva egna. Vilken databas använder du?

BrimbaMedlem sedan dec. 19995 875 inlägg
#5

Det låter som ett ganska bra problem att lösa med en förpopulerad datumtabell, som du ställer en fråga mot, exempelvis where date between '2010-01-01' and '2010-01-31', sedan left joinar du din datum_meddelande-tabell på datumet och får då direkt fram om det aktuella datumet har meddelande eller inte.

Jag googlade lite snabbt upp detta exempel på datumtabeller.
http://www.builderau.com.au/program/sqlserver/soa/Simplify-SQL-Server-2005-queries-with-a-Dates-table/0,339028455,339288411,00.htm

Mr TMedlem sedan maj 20071 061 inlägg
#6

dAEk skrev:

Mindre bra: select bla bla bla... where year(datum) = 2010 and month(datum) = 2
Bättre: select bla bla bla... where datum >= '2010-02-01' and datum < '2010-03-01'

Om jag nu gör bara en fråga/månad (ditt "Bättre" förslag) vinner jag då i tid totalt då jag får göra uppdelningen av dag-meddelandena i programmeringen? (beror ju på hur programmeringen ser ut, men jag tror vi ändå kan komma fram till ett generellt svar)

dAEk skrev:

Vilken databas använder du?

Ser att databasen på internet hotellet som min sida ligger på ligger är en "MySQL v4.1.14".

dAEkMedlem sedan feb. 20041 816 inlägg
#7

Mr T skrev:

Om jag nu gör bara en fråga/månad (ditt "Bättre" förslag) vinner jag då i tid totalt då jag får göra uppdelningen av dag-meddelandena i programmeringen? (beror ju på hur programmeringen ser ut, men jag tror vi ändå kan komma fram till ett generellt svar)

Med hulkens förslag blir det också bara en fråga. Men ja, det kommer gå snabbare.

Mr TMedlem sedan maj 20071 061 inlägg
#8

Mitt datum fältet är "date" vilket gör att Hulks förslag kan användas ypperligt.
För att snabba upp processen i programmeringen vore väll det smartaste att få ut svaren i en lista (array) som jag kan sortera efter datum?

Ska jag nu söka i alla 4 tabellerna vore det absolut smidigaste och snabbaste om jag kunde ställa en fråga för all tabeller och få ut en lista med en liten igenkänning vilken tabell resp. datum var från för tabell.
Går det att göra en sådan SQL fråga och hur skulle den i så fall se ut ?

dAEkMedlem sedan feb. 20041 816 inlägg
#9

Sorry, som jag ser det blir det en fråga per typ (meddelande, göralista, anteckning och födelsedag) och alltså inte en fråga totalt. Det viktiga är att det stannar vid 4 frågor oavsett datumintervall.

Att datumkolumnen är av typen date är bra men som jag sa tidigare: undviker man funktioner till vänster om kolumner i where-satser så får man bättre prestanda.

Sorteringen tycker jag kan göras i databasen. Databasresultseten kan läggas i varsin array, lista, map eller annan collection (jag vet inte vad som finns i PHP).

Mr TMedlem sedan maj 20071 061 inlägg
#10

Okej, så 4 frågar, betydligt bättre än dom 124st som jag riskerade att få.

Tror jag kan finna en lösning i PHP för att få det att funka, om inte vänder jag mig åter till webforum, där alla smarta (inom sitt ämne) finns :-)

(Ska prova och sedan markera ett svar som lösningen)

Mr TMedlem sedan maj 20071 061 inlägg
#11

Funkar toppen! Stort tack. (ytterligare problem uppstod, men dom hamnar i ny tråd då denna frågan får anses vara avklarad)

127 ms totalt · 3 externa anrop · v20260731065814-full.2b84b982
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)