Gå til innhold

Er 2 millioner oppføringer for mye for MySQL?


Anbefalte innlegg

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:

  1. Fordi webhotellet er tregt server?
  2. Fordi MySQL ikke liker så store tabeller, og jeg bør se meg om etter et alternativt databasesystem?
  3. Fordi jeg gjør noe på en veldig tungvindt måte?
  4. 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
Videoannonse
Annonse
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:
  1. Fordi webhotellet er tregt server?

 

Det er nok en del av det.

 

  1. 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.

 

  1. 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?

 

  1. 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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...