Avatar billede galthen Nybegynder
10. marts 2015 - 09:57 Der er 16 kommentarer

Database sortering

Jeg har en tabel med to felter.

Keyword (varchar(100)
Number (int)

I det tabellen er meget stor tager det meget lang tid at lave søgninger i den hvis jeg vel og mærke benytter "order by number"

Denne sql er hurtig " Select * from tabel where keyword like '%keywordsearch%'  LIMIT 100"
Denne sql er meget langsom " Select * from tabel where keyword like '%keywordsearch%'  order by number LIMIT 100"

Den nederste er selvfølgelig langsom i den skal hele tabellen igennem.

Mit spørgsmål er så. Kan jeg ligge data ind i databasen så det automatiske ligger sorteret. Dvs det første feldt i databasen vil være det hvor Number er højst.
Derved vil de første 100 som den finder altid være de rigtigt uden at den skal hele databasen igennem.
Avatar billede michael_stim Ekspert
10. marts 2015 - 10:13 #1
Nej. Indexering af keyword?
Avatar billede vagnk Juniormester
10. marts 2015 - 10:18 #2
1: Sæt et AUTO_INCREMENT felt på tabellen (man sætter det som reglen som første felt, men det er ikke påkrævet).
2: Sæt index på dine to felter. Hvis det ene eller det andet har unikke værdier så lav indexet UNIQUE ellers bare INDEX.

Hvis du bruger phpMyadmin laver du autonumber feltet ved at hakke af helt henne hvor der står "A_I" når du opretter feltet.
Ny indexering finder du med linket "+ Index" oven over rammen med "Information".

Hvis ikke du bruger phpMyadmin må du råbe om hjælp igen.
Avatar billede galthen Nybegynder
10. marts 2015 - 10:47 #3
Mange tak for svar.

Du svarer nej michael_stim. Er du sikker.

Laver jeg eksempelvis en søgning på '%e%' så får jeg med lynets hast en list af de første 100 rækker i tabellen i samme række følge som de blev lagt i databasen. Var de lagt i databasen direkte sorteret efter number så ville jeg have fået de første 100 i sorteret rækkefølge uden at bruge ORDER BY.
Er det ikke korrekt?


Til vagnk.
Jeg har index på felterne.
Hvad vil et auto increment feldt hjælpe?
Jeg kan ikke se hvordan det vil gøre tabellen hurtigere.
Avatar billede galthen Nybegynder
10. marts 2015 - 10:55 #4
Her kan I se index på de to tabeller:

http://eatthis.dk/index.png

Number = Searches.
Er de korrekt sat op?
Avatar billede galthen Nybegynder
10. marts 2015 - 11:37 #5
Mere info:

Denne SQL er super hurtig:
SELECT * from tabel WHERE keyword like '%porsche%' ORDER BY searches ASC

Denne er super langsom:
SELECT * from tabel WHERE keyword like '%porsche%' ORDER BY searches DESC

Hvad kan jeg gøre for at DESC er ligeså hurtig som ASC?

De to SQL sætninger er jo fuldstændig ens pånær sorteringen.
Avatar billede vagnk Juniormester
10. marts 2015 - 13:34 #6
Som udgangspunkt kan man ikke indeksere sine tabeller for meget. Læg mærke til "Som udgangspunkt". Men Du har lidt ret eftersom dit "keyword" index er UNIQUE.

Hvad vil et auto increment feldt hjælpe?
Jeg kan ikke forklare det, jeg har bare haft held med at sætte AUTO_INCREMENT på, når jeg havde store tabeller. Det tager sin tid for DB at sætte dem op for en stor tabel, men det  er min erfaring at DB kommer hurtigere igennem ved sorteringer - osse DESC - som jeg i øvrigt ikke forstår hvorfor det sløver den ned?

Databasemotoren bruger dem internt til at opbygge søgningen.

Dine queries herunder peger meget på at DB mangler lidt indeksering, og jeg synes du skal prøve AUTO_INCREMENT, du kan jo altid pille den af igen, hvis ikke den hjælper.

Jeg tror osse det vil hjælpe hvis du sorterer hele tabellen (og har kaffe parat) inden du sætter autonumber på. Når du har sat autonumber på kunne du eksperimentere med at pille dit "keyword" index af?

Jeg er meget interesseret hvis du finder en løsning, for som du nok kan fornemme har jeg selv kæmpet med problemet en gang, og måske kan man blive bekræftet eller lære noget nyt.
Hurtig: Select * from tabel where keyword like '%keywordsearch%'  LIMIT 100
Langsom: Select * from tabel where keyword like '%keywordsearch%'  order by number LIMIT 100
Hurtig: SELECT * from tabel WHERE keyword like '%porsche%' ORDER BY searches ASC
Langsom: SELECT * from tabel WHERE keyword like '%porsche%' ORDER BY searches DESC
Avatar billede galthen Nybegynder
10. marts 2015 - 13:44 #7
Tak vagnk.

Du skriver at jeg skal sortere hele tabellen før jeg kommer autoinc på.
Hvordan sortere jeg hele tabellen?
Avatar billede galthen Nybegynder
10. marts 2015 - 13:55 #8
Tror jeg fandt den :)

ALTER TABLE keywords ORDER BY searches DESC

Så venter jeg.
Avatar billede vagnk Juniormester
10. marts 2015 - 14:00 #9
I phpMyadmin, som jeg går ud fra du benytter, trykker du bare på kollonnenavnet "Number".

Hvad mener du forresten med Number = Searches. Korrekt sat op??
Avatar billede galthen Nybegynder
10. marts 2015 - 14:14 #10
Number = Searches

Det var bare at Number i virkligheden hedder Searches i tabellen.
Avatar billede vagnk Juniormester
10. marts 2015 - 14:30 #11
OK, det ændrer jo bare nogle af mine kommentarer.
Avatar billede showsource Seniormester
10. marts 2015 - 18:53 #12
Hvordan er tabellen bygget op, bare for de to felter, keywords og searches.
Og præcis hvad reprænsenterer de hver især ?
Avatar billede galthen Nybegynder
13. marts 2015 - 11:01 #13
Så virker det.
Løsningen var "ALTER TABLE keywords ORDER BY searches DESC"
Den tog 1 dag og 9 timer at køre igennem :)

Men det betyder nu at LIMIT 100 nu altid vil tage de 100 med højeste "searches". Derved skal den ikke hele tabellen igennem for at finde 100 resultater.
Avatar billede vagnk Juniormester
13. marts 2015 - 12:01 #14
Kære galthen

Jeg har nogle spørgsmål:
Det går hurtigt at vise i faldende orden, men hvor hurtigt går nu i stigende?
Det er rigtig mange rækker du har. Præcist hvor mange? Er det hele det danske sprog?
Måske skal kolonnen 'searches' være TINYTEXT og være UNIQUE?
Har du prøvet med at sætte en kolonne med autonummerering på?
Har du prøvet at sætte autonummerering på kolonnen 'searches'?
Jeg er tidligere gået ud fra at du bruger phpMyadmin. Er det tilfældet?
Måske skal du lave et UNIQUE index på begge kolonner?
  Eks: ALTER TABLE tabel ADD UNIQUE `dblidx` (keuwords, searches);

Hvis jeg var i dine sko ville jeg lave en ny tabel 50.000 rækker fra din tabel 'tabel' (som i øvrigt er et dårligt tabelnavn, hvad med at omdøbe den til f.eks. 'ord' eller 'words'?). Med denne tabel ville jeg eksperimentere lidt med nogle af de anvisninger jeg har givet. Hvis du bruger kommandoprompt skulle systemet komme ud med et tidsforbrug hver gang. Hvis du bruger phpMyadmin bliver tiden vist i en gul bjælke foroven.
Avatar billede galthen Nybegynder
13. marts 2015 - 22:08 #15
Min fulde tabel er på 800 millioner rækker. Så den er meget tung :)
Det er på engelsk.
Jeg har ikke prøvet med autonemmerring.

keyword er UNIQUE og searches are standard INDEX

Jeg experiementere videre med at lave mindre tabeller for at se hvor der kan optimeres.
Ja det er PhpMyadmin.
Avatar billede vagnk Juniormester
14. marts 2015 - 09:38 #16
Det lyder da som om du er helt galt afmarcheret. Mig bekendt består det engelske sprog af godt 1 mio ord. Selv hvis du har samtlige endelser og bøjninger repræsenteret lyder det helt vildt.

Kan du ikke forklare det lidt mere?
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