Pensarando Skrevet 6. juli 2008 Del Skrevet 6. juli 2008 Hei, Jeg skaffet meg nettopp en database på 2,1 millioner stedsnavn i verden (tabellen ble på 61 MB). Dette leste jeg inn i en enkel MySQL-tabell lik dette: id INT(10), name VARCHAR(255), country_id INT(3) Denne tabellen ligger på en MySQL-server på et norsk webhotell jeg leier. Problemet er at det tar i snitt 3-4 sekunder å kjøre enkle spørringer som SELECT * FROM places WHERE name LIKE "Oslo". Hvorfor tar det så lang tid? Er det: Fordi webhotellet er tregt server? Fordi MySQL ikke liker så store tabeller, og jeg bør se meg om etter et alternativt databasesystem? Fordi jeg gjør noe på en veldig tungvindt måte? Fordi dette er så store mengder data at jeg må ha en syk server. Jeg bør heller satse på et annet system hvor brukeren selv må legge inn steder? Lenke til kommentar
terjeelde Skrevet 6. juli 2008 Del Skrevet 6. juli 2008 Denne tabellen ligger på en MySQL-server på et norsk webhotell jeg leier. Problemet er at det tar i snitt 3-4 sekunder å kjøre enkle spørringer som SELECT * FROM places WHERE name LIKE "Oslo". Hvorfor tar det så lang tid? Er det:Fordi webhotellet er tregt server? Det er nok en del av det. Fordi MySQL ikke liker så store tabeller, og jeg bør se meg om etter et alternativt databasesystem? 61MB, or 2.1 millioner rader anses vel egentlig for å være bitteliten i databasesammenheng. Jeg jobber rutinemessig med databaser på flere hundre GB, og anser dem for å være medium til stor. Fordi jeg gjør noe på en veldig tungvindt måte? Sansynligvis. LIKE er en sammenlignings-operasjon. Hvis du vet at det skal være "Oslo" nøyaktig, så kan du bruke = istedet. Og har du husket index på name-kolonnen? Fordi dette er så store mengder data at jeg må ha en syk server. Jeg bør heller satse på et annet system hvor brukeren selv må legge inn steder? Slapp av, dette er bittesmå mengder data. Jeg vet ikke helt hva du skal gjøre med disse dataene, men kan tipse om noen ting: wfb2sql er ett system som laster ned CIA World Fact Book, og kjører inn i en database: http://wfb2sql.sourceforge.net/ Mulig det er noe data der du kan ha nytte av. Hvis du gjør avanserte komplekse spørringer, og ikke bare enkle oppslag, så vil jeg anbefale at du vurderer PostgreSQL. Det er flere grunner til dette, blant annet ytelse med mer komplekse operasjoner. Den er også veldig mye enklere å lære, og å få innblikk i hvordan serveren kommer til å utføre spørringen din. Både MySQL og PostgreSQL støtter at du kan be den fortelle deg litt om hvordan den har tenkt å gjøre en spørring. I stedet for: SELECT * FROM places WHERE name LIKE "Oslo" Så kjører du: EXPLAIN SELECT * FROM places WHERE name LIKE "Oslo" Da får du tilbake informasjon om hvilke indexer som kan/vil bli brukt, osv. Når du lurer på ting som har med spesifikke queries og ytelse å gjøre, så lønner det seg ofte å kjøre explain på den queryen, og ta med hva database-serveren gir tilbake. Lenke til kommentar
Pensarando Skrevet 6. juli 2008 Forfatter Del Skrevet 6. juli 2008 Hei, Takk for et virkelig godt svar! Som hobbyprogrammerer har jeg aldri sett meg inn i skikkelig databasebruk. Å sette index på name-kolonnen gjorde virkelig susen Jeg vet at LIKE og = har forskjellige formål, men de brukte omtrent like mye tid begge to. Nå, etter å ha satt index på name, så tar et søk etter et sted omtrent 0.002 sekunder. Litt forskjell for å si det sånn. Dessverre opptar databasen nå over 90 MB, men det skal jeg alltids leve med. Takker også for link til wfb2sql. Det så veldig interessant ut, så det må jeg undersøke nærmere. Databaser er veldig spennende, og jeg må absolutt sette meg bedre inn i det. Lenke til kommentar
terjeelde Skrevet 6. juli 2008 Del Skrevet 6. juli 2008 Jeg vet at LIKE og = har forskjellige formål, men de brukte omtrent like mye tid begge to. Nå, etter å ha satt index på name, så tar et søk etter et sted omtrent 0.002 sekunder. Litt forskjell for å si det sånn. Dessverre opptar databasen nå over 90 MB, men det skal jeg alltids leve med. Kan legge til at LIKE pleier å bruke indekser, når den kan. Hvis du derimot gjør f.eks LIKE '%slo' for å finne Oslo, så får du nok gamlefarten gjen. Søk etter 'Osl%' derimot, kan bruke indeksen en del derimot. Dette er litt av årsaken til at EXPLAIN er så nyttig. Du ser hvilke indekser som vurderes, og hvilke som brukes, så det gjør det lettere å finne ut hva som går galt med ytelse. PostgreSQL sin er vesentlig mer detaljert enn MySQL, men ved nærmere ettertanke, så er det kanskje ikke tilgjengelig på samtlige webhotel, så hjelper kanskje ikke så mye. Lenke til kommentar
Manfred Skrevet 7. juli 2008 Del Skrevet 7. juli 2008 Tekstsøk med LIKE er jo uansett noe av det tregeste du kan gjøre mot en databaseserver da. Tror jeg ville vurdert en liten omskriving av systemet mitt hvis du spør mye slik. Lenke til kommentar
blackbrrd Skrevet 7. juli 2008 Del Skrevet 7. juli 2008 Tekstsøk med LIKE som ikke starter med wildcard (%) vil kunne bruke evt indeks og er ikke tungt. Trådstarter løste jo problemet sitt ved å legge til en indeks. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå