Verwijderd schreef op 19 december 2002 @ 23:42:
Is het "verstandig" om texfields (xxxTEXT en xxxBLOB) op te slaan in een aparte tabel? Mij lijkt dit het voordeel te hebben dat je sneller kan bladeren doorheen je gegevens, als je niet echt geïnteresseerd bent in de teksten zelf. Maar wat van de andere voordelen? En de nadelen? Iemand ervaring mee?
Je wilt dus als je dit aan gegeven hebt:
message: (messageid, topicid, userid, messagecontent, messagedate);
dat opslaan als:
(messageid, topicid, userid, messagedate) en (messageid, messagecontent) ?
of als:
(messageid, topicid, userid, messagedate, textid) en (textid, messagecontent) ?
Ik denk dat de performance winst die je haalt, op het moment dat je die messagecontent niet nodig hebt, nihil is en waarschijnlijk teniet gedaan wordt door het performanceverlies dat je krijgt omdat je nu altijd je tabellen moet joinen.
Wil je echt weten hoe het performed, ga het dan uitgebreid testen

Ik zou het iig niet zomaar doen.
En wat doe je het beste: per "doel" textfield een aparte tabel aanmaken, of gewoon alles door elkaar gebruiken? Ik bedoel dus ofwel bijvoorbeeld aparte tabellen als "news_text, forumpost_text, mail_text,..." of die gewoon samenvoegen in 1 tabel "text"?
Sowieso zou ik geen functies van verschillende onderdelen samenvoegen in 1 tabel, tenzij je het zo doet:
text = (textid, textdata)
met een message tabel die zoiets doet:
message = (messageid, userid, topicid, messagedate,
textid)
(met een foreign key dus)
Deze tabellen bevatten dus (lijkt me) slechts deze 3 velden: text_id (key), text_field, text_timestamp. De waarde van een text_id veld sla je dus op daar waar je normaal een textfield zou plaatsen (en maak je dus een index).
Waar is de text_timestamp voor dan

Euh, het timestamp field is totaal overbodig, dus dat moet weg. Je wilt _niet_ sorteren op een relatie die totaal geen waarde heeft (als je alle teksten door elkaar smijt heeft je timestamp totaal geen betekenis meer voor sortering) en dan heeft een index erop ook geen nut.
Een fulltext index domweg op je tekst smijten is een van de domste dingen die je kan doen, dit heeft een enorme performance hit en alleen voordeel als je de teksten ook wilt doorzoeken.
Als je dus zo'n tabel maakt hou je 1 index over en dat is de primary key, meer dan voldoende.
_Thanatos_ schreef op 20 december 2002 @ 16:32:
Ik moet zeggen dat ik geen verstand heb van mysql's fulltext engine, maar een fulltext index op een textveld zorgt er meestal voor dat er, net als achterin een boek, een lijst gemaakt wordt met alle voorkomende woorden in alle teksten en dat daar vervolgens doorheen gezocht wordt.
Ik weet niet of het in mysql ook kan, maar in mssql kun je dan nog andere truukjes uithalen zoals "woord 1 moet in de buurt van woord 2 staan" of zoeken naar woorden die op elkaar lijken zoals "sleep" en "slept"...
Sja, maar als het niet gebruikt gaat worden moet je het absoluut niet zomaar erop smijten...
_Thanatos_ schreef op 23 december 2002 @ 15:52:
Een LIKE gebruiken zou ik altijd afraden. Ten eerste omdat dit geen full-text search doet en dus niet de hoge snelheid ervan kan behalen. Ten tweede omdat LIKE (net als REGEXP) nooit en te nimmer een index zal gebruiken en dus ook bij kleine tabellen al relatief erg traag is.
Het doet wel degelijk fulltext search, maar op een andere manier. Als je een klein genoege subset van de tekstvelden ophaalt is like ook geen probleem meer...
[edit]
Btw, ik meen zelfs ooit gelezen te hebben dat mysql de text velden standaard al niet inline met de tabel opslaat maar op een aparte plek, het kan ook geweest zijn dat dat in de postgresql manual stond en dus niet over mysql ging
Dat zal bij postgres geweest zijn
[
Voor 4% gewijzigd door
ACM op 23-12-2002 16:12
]