Avatar billede spiri Nybegynder
08. august 2001 - 23:07 Der er 45 kommentarer og
3 løsninger

Søgetid, index mv

Jeg har en tabel i en db med en masse cd\'er i (ca. 170.000). Nu skal jeg til at rode lidt med index, for at få lidt fart på. Min tabel ser således ud:

CREATE TABLE cdbase (
  cd_id int(11) DEFAULT \'0\' NOT NULL,
  kunstner varchar(250) NOT NULL,
  titel varchar(250) NOT NULL,
  status varchar(250) NOT NULL,
  year int(6) DEFAULT \'0\' NOT NULL,
  lagerantal int(11) DEFAULT \'0\' NOT NULL,
  medie varchar(20) NOT NULL,
  katalognr varchar(200) NOT NULL,
  selskab varchar(200) NOT NULL,
  CDantal varchar(20) NOT NULL,
  stregkode varchar(200) NOT NULL,
  pris float(16,2) DEFAULT \'0.00\' NOT NULL,
  genre varchar(200) NOT NULL,
  releasedato varchar(100) NOT NULL,
  PRIMARY KEY (cd_id)
);

og mine søgninger vil typisk se således ud:

select * from cdbase where kunstner = \'bla\'

select * from cdbase where titel = \'bla\'

select * from cdbase where kunstner = \'bla\' AND titel = \'bla2\'

Meget simpelt indtil videre.

Jeg har følgende spm:

1. Hvordan skal jeg lave index på tabellen for at gøre søgningen hurtigere?

2. Det er en mysql 3.23.39, er der noget med transactions der speeder det lidt op, og er det noget man selv skal \"aktivere\"?

3. Kan man få returneret søgetiden, så jeg kan se om de ændringer jeg laver hjælper? evt gennem php?

Det var vist det!
Avatar billede darkmoon Nybegynder
08. august 2001 - 23:09 #1
med på en lytter :)
Avatar billede erikjacobsen Ekspert
08. august 2001 - 23:10 #2
laver du aldrig  LIKE  ??
Avatar billede martin1000ben Nybegynder
08. august 2001 - 23:11 #3
Du skal lave index på alle de kolonner du søger på!
Avatar billede spiri Nybegynder
08. august 2001 - 23:13 #4
->ericjacobsen
jo selvfølgelig, det var en brøler
Avatar billede erikjacobsen Ekspert
08. august 2001 - 23:16 #5
Bruger du LIKE hjælper indexer ingenting - tværtimod i de fleste tilfælde.
Du skal kigge på noget der hedder noget i retning af FULLTEXTINDEX - det
er noget alvion ved alt om - *g*
Avatar billede martin1000ben Nybegynder
08. august 2001 - 23:18 #6
Nu er jeg også med på en lytter!
Avatar billede spiri Nybegynder
08. august 2001 - 23:21 #7
ok, jeg vil jo nok kun bruge like, så mens vi venter på alvion, hvad så med spm 2 og 3. Er der nogen der ved noget om det?
Avatar billede martin1000ben Nybegynder
08. august 2001 - 23:26 #8
3:
Der findes et godt program
[LINK]
http://www.anse.de/mysqlfront.zip

Der kan du indskrive sql strengen og se hvor lang tid det har taget nå den er færdig!

Programmet kan også lave brugere og reparere og en masse andet ting og sager!
Avatar billede mukke Nybegynder
08. august 2001 - 23:29 #9
Som tidligere nævnt skal du lave indexes på de felter som du søger på. ud fra ovenstående vil det sige Kunstner og Titel.

Der er dog, som nævnt lige en detalje ved Like som det er værd at være opmærksom på.

Hvis søgninger med Like starter med % bruges indexet ikke. Hvis du derimod har den første del fast, bruges indexet alligevel.

Eksempel på det første er
select * from cdbase where kunstner like \'%Kim%\'
og på det sidste:
select * from cdbase where kunstner like \'Kim%\'

Hvis du har konsol adgang til serveren vil jeg anbefale at lege lidt med \"mysql\" og fyre nogle statements af - så får du altid at vide hvor lang tid hver kørsel tager.
Avatar billede spiri Nybegynder
08. august 2001 - 23:36 #10
Jeg har adgang til serveren via konsol, men har dog aldrig prøvet at lege med mysql via den.

Har du lige et kort eksempel?

Det er bare en standard installation på en debian server.
Avatar billede mukke Nybegynder
08. august 2001 - 23:37 #11
MHT. FULLTEXTINDEX så kan jeg ikke umiddelbart se hvordan det kan hjælpe her... Det kan bruges til søgninger efter ord/tokens. - men det er næppe relevant i forbindelse med din CD database.
Avatar billede martin1000ben Nybegynder
08. august 2001 - 23:38 #12
Hvordan laver man egentlig en FULLTEXTINDEX ??? vedhjælp af PHPmyAdmin ??
Avatar billede mukke Nybegynder
08. august 2001 - 23:39 #13
[mukke@turn mukke]$ mysql
Welcome to the MySQL monitor.  Commands end with ; or \\g.
Your MySQL connection id is 679 to server version: 3.23.37

Type \'help;\' or \'\\h\' for help. Type \'\\c\' to clear the buffer

mysql> use dkdomains
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> select * from domains where name like \"eksperten%\";
+--------+------------------+-------+------------+---------+
| ID    | name            | check | Created    | Deleted |
+--------+------------------+-------+------------+---------+
|  82811 | eksperten.dk    |    1 | NULL      | NULL    |
|  82812 | ekspertenfest.dk |    1 | NULL      | NULL    |
| 313869 | eksperten-pro.dk |    1 | 2001-07-28 | NULL    |
| 313870 | ekspertenpro.dk  |    1 | 2001-07-28 | NULL    |
+--------+------------------+-------+------------+---------+
4 rows in set (0.00 sec)

mysql> quit
Bye
Avatar billede mukke Nybegynder
08. august 2001 - 23:41 #14
Forklaring:

mysql er naturligvis programmet/klienten

use dkdomains
brug databasen dkdomains.

select * ...
ja - det siger vel egentlig sig selv :)
Avatar billede alvion Nybegynder
08. august 2001 - 23:42 #15
Jamen dog er der ligefrem folk herinde der sidder og venter på mig? Jeg er beæret :-)

http://www.eksperten.dk/spm/81387  skulle besvare hvad i gerne vil vide om FULLTEXT indeks. Hvis det afføder nogle spørgsmål, så sig til herinde, så skal jeg svare så godt jeg kan

Og de andre spørgsmål:

2) Ja du kan godt bruge transactions, og nej de speeder *ikke* tingene op, hvis de endelig gør noget, så sætter de farten ned.

3) MySQL funktionerne i PHP kan ikke direkte fortælle dig hvor lang tid en query har taget, men det kan du jo selv måle således:


function getmicrotime(){
  list($usec, $sec) = explode(\" \",microtime());
  return ((float)$usec + (float)$sec);
}

$time_start = getmicrotime();

mysql_query(\"din-sql-query\") or die(mysql_error())

$time_end = getmicrotime();
$time = $time_end - $time_start;

echo \"Din query to $time sekunder\";
     
Avatar billede mukke Nybegynder
08. august 2001 - 23:44 #16
Mht til hvordan:

CREATE [UNIQUE|FULLTEXT] INDEX index_name ON tbl_name (col_name[(length)],... )

er syntaksen
Avatar billede alvion Nybegynder
08. august 2001 - 23:51 #17
mukke -> FULLTEXT indeks er i den grad relevant for spiri\'s søgning. Hvis spiri skulle søge på om kunstnernavn indeholder et bestemt ord eller om titlen indeholder dette ord med LIKE, kan MySQL ikke bruge noget indeks. Det betyder at tabellen skal løbes igennem fra enden til anden.

Et FULLTEXT indeks vil derimod kunne indsætte ordene fra såvel titel, kunstnernavn, selskab og genre og give dig en meget fleksibel søgning.

Søger du f.eks. på \"love blues\" får du alle de cd\'er, hvor blot et af de to ord indgår i blot et af de ovenstående tekstfelter. Samtidig vægtes dit søgeresultat, således at de records der indeholder begge ord prioriteres bedst samt hvor mange gange ordene indgår.
Avatar billede spiri Nybegynder
08. august 2001 - 23:51 #18
Hold da op, nu sker der noget.

->mukke

Det virker jo fint.

Måske burde jeg ikke brokke mig, da en søgning på f.eks kunstner like metallica tager 1.40 sec.

Det er vel acceptabelt. (for én bruger)

Jeg prøver lige at fedte lidt rund med de forsk. forslag.


Nu lige til et rookie spørgsmål:

Hvordan ser det ud når der nu kommer en hel bunker brugere på samme tid?
Vil indexeringen da hjælpe eller har det intet med hvor mange der tæsker løs i databasen at gøre?

Husk lige at svar, så jeg kan få delt nogen point ud:)
Avatar billede mukke Nybegynder
08. august 2001 - 23:55 #19
Alvion: ja,. men hvad nu hvis jeg skal søge efter noget af nana mouscori?

jeg er temmeligen i tvivl om hvordan det staves, ergo skriver jeg kun en del af ordet/navnet:

mous

og håber det er nok.

Som jeg forstår MATCH vil jeg IKKE få nogle resultater ud af dette. Hvis det stadig virker skal jeg gerne trække mine ord i mig igen. :) (Og jeg indrømmer gerne at jeg aldrig har brugt denne teknik så det er da ikke utænkeligt at jeg tager fejl :)
Avatar billede spiri Nybegynder
09. august 2001 - 00:00 #20
OK STOP FOR S.... hvor det rykker.

nu tager min søgning 0.02 sec!!!!!!!
istedet for 1.40 sec

FULLTEXT index rykker da alt for vildt.
Avatar billede erikjacobsen Ekspert
09. august 2001 - 00:02 #21
Så bør man vel bruge SOUNDEX hvis man ikke kan stave. Den fanger vel \"moskurri\"
Avatar billede spiri Nybegynder
09. august 2001 - 00:05 #22
Ok, lidt mere tricky:

Hvad nu hvis jeg har flere tabeller?

Senere skal jeg ha\' koblet en tabel på indeholdende hvilke numre der ligger på cd\'erne

den kunne se således ud:
CREATE TABLE cdtracks (
  trackid int(20) NOT NULL auto_increment,
  cd_id int(7) DEFAULT \'0\' NOT NULL,
  track varchar(150) NOT NULL,
  time varchar(7) NOT NULL,
  PRIMARY KEY (trackid)
);

...hvor cd_id er fremmednøglen.

Hvis jeg så skal søge på et nummer for at finde de cd\'er indeholdene pågældende nummer, hvordan ser det så ud med index?
Avatar billede spiri Nybegynder
09. august 2001 - 00:06 #23
Hov, jeg skal nok fyre flere point på, da det vist har udvidet sig lidt!
Avatar billede alvion Nybegynder
09. august 2001 - 00:08 #24
FULLTEXT indeks kan vist nok (jeg er lidt på gyngende grund her) fange ordet, hvis du har skrevet den første del. Dvs. har jeg nu navnet \"carsten\" i mit index, vil en MATCH finde det med disse \"søgeord\":

cars
carst
carsten
carsten

men ikke med disse:

arsten
arste
sten
etc...
Avatar billede mukke Nybegynder
09. august 2001 - 00:08 #25
Du kan vel bare joine dem sammen med en (inner) join?
Avatar billede alvion Nybegynder
09. august 2001 - 00:08 #26
Men det kan jeg jo lige teste...
Avatar billede alvion Nybegynder
09. august 2001 - 00:15 #27
Testet og jeg havde desværre ikke ret. Den finder kun hele ord. Det andet jeg taler om bliver - ifølge dokumentationen - implementeret i MySQL version 4.0.
Avatar billede spiri Nybegynder
09. august 2001 - 00:26 #28
Lidt en skam med søgeord, men med denne hastighed, må folk bare lære at stave:)

Lige til sidst...

Skal index\'et opdateres hver gang der kommer ændringer/tilføjelser?

og alvion husk lige at svare...
Avatar billede mukke Nybegynder
09. august 2001 - 00:32 #29
Indexet opdateres hver gang du ændrer på datagrundlaget, ja - ellers ville indexet jo ikke være opdateret og således ubrulig. :)
Avatar billede spiri Nybegynder
09. august 2001 - 00:35 #30
Det jeg mente var egentlig, om jeg selv skal opdatere det, eller om det sker automatisk?

Sikkert et dumt spm, men jeg er temmelig grøn inden for det her index-pjat.
Avatar billede mukke Nybegynder
09. august 2001 - 00:48 #31
hehe bare rolig. Det sker automatisk (omend det naturligvis tager længere tid end hvis der ikke var index på :)

BTW... af ren nysgerighed: Hvilken maskine har du til at tygge den database igennem?

Jeg har selv en redhat på en 200mhz maskine til at arbejde med godt 300.000 poster (hele dk-zonen)
Avatar billede alvion Nybegynder
09. august 2001 - 01:48 #32
Svare svare svare...
Avatar billede spiri Nybegynder
09. august 2001 - 12:31 #33
Lige et sidste spm.

Kan jeg lave flere forskellige index

f.eks:
CREATE FULLTEXT INDEX ft_1 ON cdbase (kunstner);
CREATE FULLTEXT INDEX ft_2 ON cdbase (titel);
CREATE FULLTEXT INDEX ft_3 ON cdbase (kunstner,titel);

da jeg for fejl hvis jeg søger således:
SELECT * FROM cdbase WHERE MATCH(kunstner) AGAINST (\'søgeord\');

på et index jeg har lavet der hedder:
CREATE FULLTEXT INDEX ft ON cdbase (kunstner,titel);

...man skulle gerne kunne søge på kunstner, eller titel eller begge dele.

Skal jeg altså have 3 index???

Avatar billede mukke Nybegynder
09. august 2001 - 13:26 #34
tjae.. jeg er ikke helt klar over hvor meget det giver at have et kombineret index - det du skal lave vil som minimum være et indeks på hver af de to felter... om den tredie skal med kan du jo eksperimentere lidt med via mysql klienten. (prøv nogle opslag med og uden det tredie, kombinerede index.
Avatar billede alvion Nybegynder
09. august 2001 - 15:20 #35
Du kan sagtens lave flere FULLTEXT indeks.

Din MATCH sætning skal altid indeholde de samme feltnavne som en af dine FULLTEXT indeks. MySQL finder så selv ud af hvilken af dine indeks den skal bruge.
Avatar billede alvion Nybegynder
09. august 2001 - 15:21 #36
mukke -> Det et kombineret indeks giver er muligheden for at lave \"fritekstsøgning\" på hele records på tværs af felterne. Det kan være meget brugbart.
Avatar billede spiri Nybegynder
09. august 2001 - 15:32 #37
Ok, så holder det jo.

Kan man forøvrigt, på en eller anden må søge på en streng.

F. eks \"ray of light\".

sådan som jeg har forstået dokumentationen vil den i ovenstående tilfælde smide både \"ray\" og \"of\" væk, med mindre man recompiler mysql, til at acceptere ord mindre end 3 karakterer.

...men det er vist ikke nogen god idé. Men som sagt kan man få den til at opfatte \"ray of light\" som ét ord?

Ellers er det jo lige før man ikke kan bruge dette ellers fantastisk hurtige index-værk.

..og det ville være f.... være en skam.
Avatar billede spiri Nybegynder
09. august 2001 - 15:33 #38
ups...

\"Kan man forøvrigt, på en eller anden må søge på en streng.\"

skal være:
Kan man forøvrigt, på en eller anden måde søge på en streng.





Avatar billede mukke Nybegynder
09. august 2001 - 15:36 #39
Det samme gør sig desværre gældende her som ved dele af ord: Hvis det skal være muligt (og det vil jeg tro det skal) så kan du ikke bruge fulltext indexes :(
Avatar billede spiri Nybegynder
09. august 2001 - 15:42 #40
æv æv æv æv.

Ville det være for langt at oprette 2 attributter mere f.eks kunstner_seek og title_seek og derefter løbe alle posterne igennem, for så at indsætte \"ray of light\" som ray_of_light i de nye attributter?

...eller ville det være for meget et \"spagettihack\"?

ps. selvfølgelig skulle man også tilpasse det i php så underscores bliver indsat mellem orderne.


Nu skal jeg forøvrigt nok snart holde min bøtte i dette spørgsmål!
Avatar billede mukke Nybegynder
09. august 2001 - 15:48 #41
Jeg er ikke helt med i hvad du mener...

Vil du, når man søger efter noget, tilføje søgestrengen til alle poster? Hvad skulle det gøre godt for?

Vil du i forbindelse med indsætning af dataene samtidig lave ekstra felter med hele teksten uden mellemrum men _ i stedet? I så fald vil MATCH bare opfatte hele titlen henholdsvis kunstneren som et ord/token, og du vil stadigvæk ikke have opnået noget.

Eller er jeg helt galt på den her? :)
Avatar billede alvion Nybegynder
09. august 2001 - 15:52 #42
Avatar billede spiri Nybegynder
09. august 2001 - 16:09 #43
Det ville være i forb. med indsættelse af data at jeg ville lave de ekstra ting, men det er sgu\' for meget et hack til at det holder.

Men det ville da virke, hvis jeg nu bruger førnævnte eks.

ville titel være \'ray of light\'
og titel_seek være \'ray_of_light\'

hvis jeg så har lavet FULLTEXTINDEX på feltet titel_seek og min søgning ser således ud:

select * from cdbase MATCH(titel_seek) AGAINST (\'ray_of_light\');

så ville den jo finde denne cd først istedet for kun at søge ud fra \'light\', hvor cd\'en i dette tilfælde være langt nede i \"relavans-listen\"


Men som sagt, det holder ikke, så hellere vente på v. 4.1
Avatar billede mukke Nybegynder
09. august 2001 - 16:11 #44
hvis du alligevel vil søge efter hele titlen kan du da bare bruge et normalt index, og så garanterer jeg dig at du vil få hurtige søgetider :)
Avatar billede runesoft Nybegynder
11. august 2001 - 16:25 #45
Jeg har også et lille spørgsmål vedr. dette fantastisk fulltextindex ting. Jeg har en database med en masse navne i. det fungerer fint med fulltext, men sammensatte navne får jeg ikke med f.eks. navn: Bente Knudsen-Petersen
Jeg får hverken posten frem ved at søge \'knudsen\', \'pedersen\' eller \'knudsen-pedersen\'. Hvad skal jeg så søge på?
Avatar billede runesoft Nybegynder
11. august 2001 - 16:45 #46
Navnet er selvfølgelig Bente Knudsen-Petersen :-)
Avatar billede alvion Nybegynder
13. august 2001 - 11:53 #47
MySQL definerer ord til ordlisten som værende \"sammensætninger af tegn imellem whitespaces\". Jeg ved ikke om bindestreg \"-\" tæller som et whitespace, men ellers kan du jo selv tilføje det i sourcekoden. :-)
Avatar billede runesoft Nybegynder
15. august 2001 - 13:54 #48
Det må jeg gøre. Men jeg kan stadig ikke forstå at det fulde efternavn ikke giver noget udtræk. Men det må der stå om et eller andet sted :-) Takker...
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