|
|
 | [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
| |
|
|