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

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



Seneste spørgsmål Seneste aktivitet
25 min siden Prosomic 65 uand8009 Af Bassine i Fjernsyn & projektorer
I går 20:46 opkaldside Af hagbartm i Mobiltelefoner
I går 16:05 win 10 vil ikke boote Af bb69 i Windows
I går 11:20 Lenovo x390 Af tobberjas i PC
I går 10:14 Alder i Excel Af Nanarsi i Excel