Avatar billede killer_r Nybegynder
22. november 2009 - 20:00 Der er 10 kommentarer og
1 løsning

Versionsstyring - MySQL subqueries er langsom!

Hej Eksperter,

Jeg har et problem med en subquery i MySQL (version 4.1) der er urimelig langsom.
Problemet opstår når jeg vil lave en slags versions-styring af en række filer ved at have en tabel der indeholder informationer omkring filerne og kunne eksempelvis se således ud:
[code]
+------------------------------------+
| path  | con1  | con2  | Version |
+------------------------------------+
| file1  | 1201  | LC    | 1      |
| file2  | 1201  | LC    | 2      |
| file3  | 1202  | SC    | 1      |
| file4  | 1201  | SC    | 1      |
| file5  | 1202  | SC    | 2      |
+------------------------------------+
[/code]

Det jeg ønsker er at udtrække de rækker med fast con1 og con2 hvor Version er størst mulig.
SQL-koden jeg gør dette med ser således ud:
[code]
select * from files where files.Version = (select max(f2.Version) from files f2 where files.con1=f2.con1 and files.con2=f2.con2);
[/code]

Dette vil få den ovenstående tabel til at se sådan ud:
[code]
+------------------------------------+
| path  | con1  | con2  | Version |
+------------------------------------+
| file2  | 1201  | LC    | 2      |
| file4  | 1201  | SC    | 1      |
| file5  | 1202  | SC    | 2      |
+------------------------------------+
[/code]

Den ovenstående kode virker fuldstændig korrekt.
Problemet er bare at denne operation er UBEGRIBELIG langsom (>40 sek) når tabellen er rimelig stor (>10000 elementer).

Jeg har kunnet google mig frem til at problemet kunne skyldes en bug i MySQL der gør subqueries langsom (http://bugs.mysql.com/bug.php?id=9090), men jeg vil helst undgå at skulle prøve at opdatere server-software'en.

Så mit spørgsmål er simpelt:
Er der en måde at gøre dette på der ikke er så langsom?

Med venlig hilsen,
Rasmus
Avatar billede arne_v Ekspert
22. november 2009 - 20:30 #1
Har du index paa de relevante felter?
Avatar billede arne_v Ekspert
22. november 2009 - 20:32 #2
con1, con2 og version maa vaer de relevante.
Avatar billede killer_r Nybegynder
22. november 2009 - 20:37 #3
Nej det har jeg ikke.
Men kan det virkelig være årsag til den enorme faktor >1000 forsinkelse?
Avatar billede arne_v Ekspert
22. november 2009 - 20:42 #4
Ja.
Avatar billede killer_r Nybegynder
22. november 2009 - 21:10 #5
Okay. Jeg prøver at tilføje index på den her måde:

alter table files add index(con1,con2,Version);

Men den melder en fejl:
BLOB/TEXT column 'con2' used in key specification without a key length.

Så hvordan får jeg sat en "key length" på en TEXT kolonne?
Avatar billede killer_r Nybegynder
22. november 2009 - 21:19 #6
Men allerede ved at tilføje index på de to andre kolonner, er der en enorm hastigheds-forøgelse at se! :-)
Avatar billede arne_v Ekspert
23. november 2009 - 00:23 #7
Jeg tror at jeg ville have sat 3 index af 1 felt fremfor 1 index af 3 (eller 2) felter på.
Avatar billede arne_v Ekspert
23. november 2009 - 00:25 #8
Med et tekst felt skal du sætte index

feltnavn(n)

for at fortælle den at du kun vil indeksere de første n tegn af tekst feltet. n kunne være 10 eller 20.
Avatar billede showsource Seniormester
23. november 2009 - 11:14 #9
Du er altså en haj, arne !

Og ja, index hjælper gevaldigt.
( En bog med eller uden indholdsfortegnelse )

( Fandt jeg ud af i tidl. oprettet spm. som arne besvarede :O] )
Avatar billede killer_r Nybegynder
23. november 2009 - 23:14 #10
arne, du er min personlige frelser!
Tusinde tak for hjælpen!

Smid et svar og du får point!
Avatar billede arne_v Ekspert
24. november 2009 - 01:00 #11
kommer her
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