/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
[MySQL] Optimering af dato søgninger
Fra : Emil Rasmussen


Dato : 30-11-01 12:29

Hey

Jeg har et tabel med 9000+ poster, hvilket jo egentligt ikke er så meget,
men jeg er ikke tilfreds med hastigheden ved følgende query:

SELECT count(id) FROM tblTabel WHERE felt != '' AND
DATE_FORMAT(mitDatoFelt,'%Y%m%d') = 20011120;

Det tager for langt tid, når jeg laver den på en måned af gangen.

Jeg har et index på felt og mitDatoFelt, men det bliver ikke brugt fordi,
jeg jo laver en funktion på mitDatoFelt og MySQL jo så alligevel skal
igennem alle felter.

Mit spørgsmål er så, om jeg virkelig skal dele dato feltet op i selvstændige
felter så min query bliver sådan her:

SELECT count(id) FROM tblTabel WHERE felt != '' AND datoYear = 2001 AND
datoMonth = 11 AND datoDay = 20;

Der er et eller andet jeg ikke kan lide, ved at gør det på den måde, men mon
ikke der er nogle der har nogle erfaringer?

Mvh Emil
--
Emil Rasmussen
http://noget.net



 
 
Martin Elkjær Nielse~ (30-11-2001)
Kommentar
Fra : Martin Elkjær Nielse~


Dato : 30-11-01 17:55

Hej Emil,

Hvad er datatyperne for felterne ??

Martin




Emil Rasmussen (03-12-2001)
Kommentar
Fra : Emil Rasmussen


Dato : 03-12-01 10:32

> Hvad er datatyperne for felterne ??

Det er et felt, og det er datatype timestamp(14).

Mit spørgsmål var jo, om det var smart at dele det op i flere integer
felter?

Mvh Emil
--
Emil Rasmussen
http://sophistic.dk



Nis Jorgensen (03-12-2001)
Kommentar
Fra : Nis Jorgensen


Dato : 03-12-01 12:32

On Fri, 30 Nov 2001 12:28:36 +0100, "Emil Rasmussen"
<4833o41fj001@sneakemail.com> wrote:

>Jeg har et tabel med 9000+ poster, hvilket jo egentligt ikke er så meget,
>men jeg er ikke tilfreds med hastigheden ved følgende query:
>
>SELECT count(id) FROM tblTabel WHERE felt != '' AND
>DATE_FORMAT(mitDatoFelt,'%Y%m%d') = 20011120;
>
>Det tager for langt tid, når jeg laver den på en måned af gangen.
>
>Jeg har et index på felt og mitDatoFelt, men det bliver ikke brugt fordi,
>jeg jo laver en funktion på mitDatoFelt og MySQL jo så alligevel skal
>igennem alle felter.

Nu ved jeg ikke hvordan mySQL's optimizer virker, men jeg vil tro at
problemet er at du konverterer til tekst. Kan du ikke bare trunkere
datoværdien, og sammenligne med en dato. Med Access-syntax:

DateValue(mitDatoFelt) = #11/20/2001#


--
Nis Jorgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Emil Rasmussen (03-12-2001)
Kommentar
Fra : Emil Rasmussen


Dato : 03-12-01 17:38

Hej

> Nu ved jeg ikke hvordan mySQL's optimizer virker, men jeg vil tro at
> problemet er at du konverterer til tekst. Kan du ikke bare trunkere
> datoværdien, og sammenligne med en dato. Med Access-syntax:
>
> DateValue(mitDatoFelt) = #11/20/2001#

Ja, nemlig problemet er at alle data skal omdannes via DATE_FORMAT
funktionen. Din access syntaks kan jeg ikke lige overføre, men jeg har da
fået inspiration til at finde noget tilsvarende.

Nogle MySQL folk der kender "hemmeligheden"?

Mvh Emil
--
Emil Rasmussen
http://noget.net



Kristian Damm Jensen (03-12-2001)
Kommentar
Fra : Kristian Damm Jensen


Dato : 03-12-01 13:23

Emil Rasmussen wrote:
>
> Hey
>
> Jeg har et tabel med 9000+ poster, hvilket jo egentligt ikke er så meget,
> men jeg er ikke tilfreds med hastigheden ved følgende query:
>
> SELECT count(id) FROM tblTabel WHERE felt != '' AND
> DATE_FORMAT(mitDatoFelt,'%Y%m%d') = 20011120;
>
> Det tager for langt tid, når jeg laver den på en måned af gangen.
>
> Jeg har et index på felt og mitDatoFelt, men det bliver ikke brugt fordi,
> jeg jo laver en funktion på mitDatoFelt og MySQL jo så alligevel skal
> igennem alle felter.
>
> Mit spørgsmål er så, om jeg virkelig skal dele dato feltet op i selvstændige
> felter så min query bliver sådan her:
>
> SELECT count(id) FROM tblTabel WHERE felt != '' AND datoYear = 2001 AND
> datoMonth = 11 AND datoDay = 20;
>
> Der er et eller andet jeg ikke kan lide, ved at gør det på den måde, men mon
> ikke der er nogle der har nogle erfaringer?

Er der noget galt med

SELECT count(id) FROM tblTabel WHERE felt != '' AND
mitDatoFelt between '20011120 00:00:00' and '20011120 23:59:59'

?


--
Kristian Damm Jensen | Feed the hungry. Go to
kristian-damm.jensen@cgey.dk | http://www.thehungersite.com
Two wrongs doesn't make a right, but three lefts do.


Emil Rasmussen (03-12-2001)
Kommentar
Fra : Emil Rasmussen


Dato : 03-12-01 17:34

Hej

> Er der noget galt med
>
> SELECT count(id) FROM tblTabel WHERE felt != '' AND
> mitDatoFelt between '20011120 00:00:00' and '20011120 23:59:59'


Det er der ikke noget galt med, men den scanner stadigt hele tabellen
igennem. Hastigheden er derfor sort set den samme. Desværre ellers godt bud.

Mvh Emil
--
Emil Rasmussen
http://noget.net



Nis Jorgensen (04-12-2001)
Kommentar
Fra : Nis Jorgensen


Dato : 04-12-01 10:54

On Mon, 3 Dec 2001 17:33:47 +0100, "Emil Rasmussen"
<4833o41fj001@sneakemail.com> wrote:

>Hej
>
>> Er der noget galt med
>>
>> SELECT count(id) FROM tblTabel WHERE felt != '' AND
>> mitDatoFelt between '20011120 00:00:00' and '20011120 23:59:59'
>
>
>Det er der ikke noget galt med, men den scanner stadigt hele tabellen
>igennem. Hastigheden er derfor sort set den samme. Desværre ellers godt bud.

Hvis denne skanner hele tabellen igennem, er det formodentlig fordi
den ikke vurderer at indexet vil forbedre performance.

--
Nis Jorgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Emil Rasmussen (04-12-2001)
Kommentar
Fra : Emil Rasmussen


Dato : 04-12-01 14:19

> Hvis denne skanner hele tabellen igennem, er det formodentlig fordi
> den ikke vurderer at indexet vil forbedre performance.

Ja, det lyder sgu meget rigtigt

Men hvad kan man så gøre for at lave et index der ville forbedre
performance? 30 gange en scanning af en tabel med 9000+ poster går for
langtsomt. Den taget 0.27 sec pr dage i en måned.


Mvh Emil
--
Emil Rasmussen
http://noget.net



Nis Jorgensen (04-12-2001)
Kommentar
Fra : Nis Jorgensen


Dato : 04-12-01 14:57

On Tue, 4 Dec 2001 14:19:18 +0100, "Emil Rasmussen"
<4833o41fj001@sneakemail.com> wrote:

>
>Men hvad kan man så gøre for at lave et index der ville forbedre
>performance? 30 gange en scanning af en tabel med 9000+ poster går for
>langtsomt. Den taget 0.27 sec pr dage i en måned.

Hvad med at udføre dem alle på en gang, med en GROUP BY <et eller
andet udtryk der giver datoen>?

--
Nis Jorgensen
Amsterdam

Please include only relevant quotes, and reply below the quoted text. Thanks

Emil Rasmussen (04-12-2001)
Kommentar
Fra : Emil Rasmussen


Dato : 04-12-01 15:53

> Hvad med at udføre dem alle på en gang, med en GROUP BY <et eller
> andet udtryk der giver datoen>?


Jeg har fået den til at bruge indexet nu. Jeg havde lavet et index der
indeholde både "felt" og "mitDatoFelt", og det ville den ikke bruge. Så
lavede jeg et index på kun "mitDatoFelt" og nu scanner den kun ca. 14 rows
igennem. Så er der fart over feltet!

Mange tak for hjælpen!

Mvh Emil
--
Emil Rasmussen
http://noget.net



Emil Rasmussen (04-12-2001)
Kommentar
Fra : Emil Rasmussen


Dato : 04-12-01 15:54

>
> SELECT count(id) FROM tblTabel WHERE felt != '' AND
> mitDatoFelt between '20011120 00:00:00' and '20011120 23:59:59'

Den fungere perfekt, når jeg laver det rigtige index.

Tak for hjælpen.

Mvh Emil
--
Emil Rasmussen
http://noget.net



Søg
Reklame
Statistik
Spørgsmål : 177517
Tips : 31968
Nyheder : 719565
Indlæg : 6408636
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste