Jump to content
php.lv forumi

Ierakstu skaitīšana lielā datubāzē


nekonezinu

Recommended Posts

Sveiki!

Problēma ir tāda ka datubāzē ir ~100 000 ierakstu un pie meklēšanas notiek atrasto ierakstu skaitīšana, kas aizņem sākot no dažām sekundēm līdz pāris minutēm(kas notiek gandrīz visu laiku), ir taisīti indexi visi trīs bet ātrums uzlabojas minimāli, gandrīz neuzlabojas. Kverija kuru izmantoju skaitīšanai ir :

 

SELECT COUNT(*) FROM linki WHERE MATCH (title) AGAINST ('+"$s"'in boolean mode) - šī kvērija tikai dažos gadījumos skaita, citos neskaita un atgriež ka rezulātu nav, kaut arī ir

SELECT COUNT(*) FROM linki WHERE title LIKE '%$s%' - ši skaita ļoti lēni

 

Varbūt varat man palīdzēt?

Link to comment
Share on other sites

  • Replies 60
  • Created
  • Last Reply

Top Posters In This Topic

777: kāds tavis teiktajam ir sakars ar autora problēmu?

 

nekonezinu: pirmajam variantam FULLTEXT indekss bija uzlikts?

Un noņem nost to "in boolean mode", lai meklētu precīzu frāzi.

Link to comment
Share on other sites

Otram variantam nekādi indexi napalīdzēs. Vienā projektiņā laika gaitā uzradās šāda pati problēma - jo vierāk meklējamo ierakstu, jo meklēšana pēc '%frāze%' totāli iebremzē . Es to atrisināju šādi:

Ieviesu trīs tabulas:

urls - interesējošā resursa visi linki (ziņas, forums, ...)

words - visu url unikālie vārdi

words2urls - samapot vārdus ar urliem

 

Reizi stundā fōnā iet crawleris, kas pievieno jaunos urlus (ko un kā pievienot definē ar klasi).

 

Meklēšana notiek pēc unikāla indexa (vārdu tabulā) un pēc primary url tabulā, attiecīgi - ātrums faktiski nemainās no datu apjoma.

 

Statistikai:

Vienā db ir kā reiz biki virs 100`000 url, 245`000 vārdi, un 2.5miljoni saites starp vārdiem un url.

 

Kāpēc ne FULLTEXT? Ja es pareizi atminos, tad FULLTEXT index nevarēja meklēt pēc vārda daļas? Augstāk minētajam variantam relatīvi vienkārši var pievienot fīču meklēt pēc vārda daļas vai locījumos <- turpmākais darbs pie šī meklētāja.

Link to comment
Share on other sites

Nē, Tev jāsadala title pa vārdiem un jāliek tabulā `words` (nosaukums, protams, pēc izvēles) kā word_id|word, kur `word_id` ir primary key, un `word` ir unikāls.

Otrā tabulā (`words2title`) title_id|word_id, kur title_id ir primary key no tabulas `linki` (Tavā gadījumā) un word_id ir primary key no tabulas `words`.

 

Pēc tam selekts no words tabulas pēc interesējošā atslēgvārda un joins ar words2title tabulu.

 

Es taisīju, lai der jebkādam resursam (url), bet var, protams, taisīt arī kontrētai tabulai (`linki`).

Link to comment
Share on other sites

Es domāju, ka nesanāks 1 ieraksts, jo ir daudz linku, un vārdi noteikti atkārtosies!?

Saproti - nav tolks atkārtot vārdus, priekš tam ir starptabula, kas saivieno titli un vārdu. Vienā tabulā linki (ar titlēm), otrā vārdi (unikāli), trešā (starptabula) title_id un vārda_id. Trešajā tabulā var ieviest vārdu skaitu - t.i. cik reizes vārds atkārtojas titlē.

Link to comment
Share on other sites


×
×
  • Create New...