[mysql] Kan dit beter??

Pagina: 1
Acties:

  • EgoH
  • Registratie: Oktober 2001
  • Laatst online: 08:41
Ik heb dus site met database (rond de 80.000 records).
Nu gebruik ik deze code om in de database te zoeken.
PHP:
1
<?$db = mysql_connect("localhost", "user", "pass");mysql_select_db("database",$db);$splitted = split ('[ +]', $search);$count="0";$select.= "SELECT id, name FROM tabel WHERE ";foreach($splitted as $word){if($count != "0"){$select.= " AND ";}$select.="name like '%$word%'";$count++;}$select.= " limit 50";$result = mysql_query($select)    or die("Query failed");?>

Nu is het probleem dat als er bijvoorbeeld 5 searches per seconden zijn, dat de load gewoon boven de 2.00 gaat liggen.
Is er een efficientere manier, zonder dat de search resultaten verslechteren?
Ik zou het graag willen weten

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Er zijn allerlei varianten van betere zoekmachines.
Probeer nog even de search te gebruiken in P&W. O.a. bartvb heeft er een nuttig topic voor geopend.

OA dees:
[topic=277291]
en
[topic=305783]

  • EgoH
  • Registratie: Oktober 2001
  • Laatst online: 08:41
ok, dat wordt dus een index tabel neem ik aan?
hmm zal maar is gaan kijken hoe ik at het beste kan maken...

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Dat is idd een makkelijke, redelijk efficient oplossing :)

  • EgoH
  • Registratie: Oktober 2001
  • Laatst online: 08:41
Ok dus alle rows scheiden op spaties en de woorde+row id opslaan in de tabel.
Houdt me weer een middag van de straat :)

Dab schilt een name='$search' zeker heel veel met like '$search' in server load?

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op zaterdag 04 mei 2002 13:12 schreef EgoH het volgende:
Dab schilt een name='$search' zeker heel veel met like '$search' in server load?
LIKE is het traagste wat er is kwa vergelijkingen. Zeker als je fikse lappen tekst hebt.

Als je dan ook nog es een woord-woordid tabel maakt en per tekstje bijhoudt welk woordid er in zat is het nog efficienter.

Dan doe je dus eenmalig een tekst->integer mapping en verder steeds integer vergelijkingen (snelste van de vergelijkingen).

  • EgoH
  • Registratie: Oktober 2001
  • Laatst online: 08:41
Ow zo, dus dan nog een extra tabel met woord<>woorid
dan tabel woordid<>rowid
dan de eigenlijke rijen selecteren op basis van de nummers.
Ik snap het denk ik :)
Het nadeel is dan toch wel dat op een deel van het woord zoeken niet meer gaat.
als je racketlancering hebt, en je zoekt op raket vindt hij niks, maja moeten ze dan maar mee leren leven.

Ik zou dat bijvoorbeeld wel kunnen oplossen door bij geen resultaten de oude search er nog eens overheen te laten gaan.

Iemand nog tips waar ik op moet letten?

  • EgoH
  • Registratie: Oktober 2001
  • Laatst online: 08:41
Nou ik je post voor de 3e keer lees zie ik pas dat je het anders bedoelt.
Welke is nu de beste?:
code:
1
2
3
4
5
6
7
8
1. 1.tabel met woorden<>woordid
   2.tabel met woordid<>rowid van tabel met woord
   3.select op basis van rowid die je met search gekregen hebt.


2. 1.tabel met woorden<>woordid
   2.tabel met normaal row nummer<>geen woorden maar de wordid's
   3.select op basis van rowid die je met search gekregen

Hoop dat het duidelijk is wat ik bedoel

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op zaterdag 04 mei 2002 13:45 schreef EgoH het volgende:
als je racketlancering hebt, en je zoekt op raket vindt hij niks, maja moeten ze dan maar mee leren leven.

Ik zou dat bijvoorbeeld wel kunnen oplossen door bij geen resultaten de oude search er nog eens overheen te laten gaan.

Iemand nog tips waar ik op moet letten?
Eventueel zou je nog een LIKE op je woord-woordid tabel kunnen doen :)
En met jouw "kleine" tabel is een LIKE als er geen resultaten (of als extra optie) idd nog wel haalbaar :)

[edit]
Bovenstaand moet je optie 1 gebruiken, in geen geval moet je je textrepresentatie gaan vervangen. Dat is weer erg vervelend als je er andere dingen mee wilt gaan doen :)

  • EgoH
  • Registratie: Oktober 2001
  • Laatst online: 08:41
Sorry dat ik deze nog omhoog haal, maar ik heb veel records die bijna hetzelfde in naam zijn.
Dan is het bij de woord<>woordid tabel zo dat 1 woord best vaak voorkomt.
Is dit dan gewoon zo, of is hier ook iets beters voor?

  • bluewarlord
  • Registratie: Augustus 2000
  • Laatst online: 07-06 09:58
Er zijn een paar "Slimme" manieren om string matching te doen, 1 is inderdaad een hash lijst maken met alle woorden erin en daarin zoeken die verwijst naar de hele zinnen. Die kun verder nog sneller worden door aparte lijsten te maken voor de verschillende woordlengtes en als dat nog niet genoeg is pas je de google truc toe, verdeel afhankelijk van de start van een string de data over meerdere PC's

Language exists to conceal true thought

Pagina: 1