Avatar billede trumf Nybegynder
21. august 2003 - 23:24 Der er 12 kommentarer og
1 løsning

Access hurtigere end mySQL

Hejsa eksperter

Jeg har lige installeret mySQL 4.1 som understøtter subqueries.
Jeg har denne forholdsvis lange SQL som jeg fyrer af mod en tabel med ca 1500 poster.
SQL'en er noget i stil med:

SELECT *, 1 AS Q from tabel WHERE (a AND b) UNION SELECT *, 2 AS Q from tabel WHERE (a OR b) AND id NOT IN (SELECT id from tabel WHERE (a AND b)) ORDER BY Q

Denne sql giver giver et resultat hvor alle resultater hvor både a OG b er sandt listes først og derefter hvor enten a ELLER b er sandt.

Problemet er bare at i Access giver den 1203 resultater på et split-sekund, hvorimod mySQL er 22,3 sekunder om at give det samme resultat, med samme søgeord!

Jeg troede at mySQL var den hurtigste database i verden!!!

Hvad dælen er der galt her ?
Avatar billede oneskarvonly Nybegynder
21. august 2003 - 23:26 #1
lytter med....
Avatar billede fsconsult.dk Nybegynder
21. august 2003 - 23:28 #2
jeg tror nu nok at både Oracle og DB2 er hurtigere, hvis de er sat rigtigt op!  :-) 

men at Access (som jo ikke er en database), skulle være hurtigere lyder dog besynderligt.

har du index på relevanter felter i mysql databasen?
Avatar billede bearhugx Nybegynder
21. august 2003 - 23:29 #3
lytter også med her... Omend jeg ikke har så meget til overs for access som db i produktionsmiljøet -- men selvfølgelig kan det tænkes at den kan udføre nogle kald bedre end MySQL - især når man betænker at MySQL kun lige fornyligt har fået sub-query support...

dog må jeg sige at jeg er overrasket over forskellen  1 sek <--> 23 sek.

/Søren
Avatar billede arne_v Ekspert
21. august 2003 - 23:29 #4
MySQL 4.1 er så vidt jeg ved ikke production ready endnu !

subquerys er en ny feature i 4.1 og derfor næppe optimeret endnu !

MySQL er generel en hurtig database, men derfor behøver den ikke være
hurtigst til alt (og den her query er næppe "typisk") !
Avatar billede arne_v Ekspert
21. august 2003 - 23:32 #5
Iøvrigt er det kun delvist sandt at Access er langsomt.

Read adgang til database på lokal harddisk er faktisk ikke så
dårligt.

Problemerne kommer med mange samtidige opdateringer eller med
database på netværks drev.
Avatar billede trumf Nybegynder
21. august 2003 - 23:45 #6
Der er ikke index i nogle af databaserne

Forskellen på tiderne er 0,1 mod 22,3 sekunder

4.1 er er alpha udgave, men altså den eneste "version" der understøtter IN som subquery. IN er understøtter i tidligere versioner ved f.eks. SELECT * FROM tbl WHERE a IN (1,2,3)

Og så vil jeg lige tilføje at sådan som en database opfattes i dag, så kan det diskuteres om Access er er "rigtig" database, men oprindeligt er en database jo "bare" et repository for data med en masse pointere, og så er Excel jo i teorien også en database. Jeg har da brugt excel som database på små websider, hvor en lille udvalgt skare skulle kunne hente databasen og udskrive den på en nem måde....

Men hvorom alting er, så må der da kunne gøres noget, ellers må jeg gå tilbage til Access indtil "de" får optimeret IN i mySQL :-(
Avatar billede arne_v Ekspert
21. august 2003 - 23:51 #7
Performance betyder vel kun noget i production og man kører da ikke
production på en database som leverandøren ikke mener er ready for
production.

Hvis du absolut skal bruge subqueryes nu så vælg en anden gratis database:
PostgreSQL, SAP DB, Interbase/Firebird eller en af de mindre kendte.
Avatar billede trumf Nybegynder
21. august 2003 - 23:53 #8
Jeg har ikke generingstiderne for hvor lang tid det tager på nettet, men der er en betydelig forskel der også. Hvis nogen vil se det i praksis, så ligger testsiden med mySQL på www.emlopen.dk og den med Access ligger på www.vinguide.net
Søg på m og d (m mellemrum d) i søgefeltet ude til venstre.
På testsiden kan man også se SQL'en der fyres af. Håber det kan hjælpe et klogt hoved til at komme med en forklaring/løsning :-)
Avatar billede trumf Nybegynder
22. august 2003 - 00:07 #9
Jeg kunne selvfølgelig bruge mySQL's fede funktion LIMIT, som vil optimere SQL'en meget, men i dette spm. vil en forklaring være at foretrække.
arne_v's mening om at IN ikke er optimeret lyder dog sandsynlig...
Avatar billede arne_v Ekspert
22. august 2003 - 07:48 #10
Der er vel ingen tvivl om hvad der sker.

Access udregner SELECT id from tabel WHERE (a AND b) en gang og
gemmer resultatet og så er det nemt at lave NOT IN.

MySQL udregner den for hver enste record der matcher "a OR b" kravet.
Avatar billede arne_v Ekspert
22. august 2003 - 07:49 #11
Iøvrigt vil jeg tro at den kunne laves lidt anderledes:

SELECT *, 1 AS Q from tabel WHERE (a AND b) UNION SELECT *, 2 AS Q from tabel WHERE ((a AND NOT b) OR (b AND NOT a)) ORDER BY Q

og den tror jeg at MySQL bedre vil kunne optimere.
Avatar billede arne_v Ekspert
24. august 2003 - 18:47 #12
OK ?
Avatar billede trumf Nybegynder
25. august 2003 - 09:32 #13
Det er OK...

Jeg har haft pjutterfri weekend ;-)

Jeg tror dog jeg beholder den "gamle" SQL men bruger LIMIT og venter på at den bliver optimeret, da jeg ikke kan få den anden til at fungere helt efter planen. Kravet a OR b bliver kompliceret hvis der skrives 5 ord i søgestrengen, for så er der jo pludselig a, b, c, d og e der skal med...

Takker for foklaringen.
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