ugrás a tartalomhoz

Keresés akár több kulcsszó alapján

gabesz666 · 2009. Okt. 11. (V), 14.56
Sziasztok

Adott egy auto complete-es combo amibe egy kulcsszó halmaz alapján adnám vissza az eredményt. Összesen 6 mezőben kell keresnem és ha a kulcsszavak bármelyike előfordul az adott mezőben, akkor vissza kell adnom a rekordot. Konkrétabban: intézmény választó combo, ahol lehet keresni intézmény névre, irányítószámra, település névre, címre, telefonra, kapcsolattartó nevére. Mindezt egy 50,000 soros táblában. Először a következő őrültséggel próbálkoztam:

SELECT sx_intezmenyek. * , sx_telepulesek.telepules_nev FROM `sx_intezmenyek` , `sx_telepulesek` WHERE (sx_intezmenyek.irszam = sx_telepulesek.irszam AND (CONCAT(sx_intezmenyek.intezmeny_nev, sx_intezmenyek.irszam, sx_telepulesek.telepules_nev, sx_intezmenyek.cim, sx_intezmenyek.kapcs_nev, sx_intezmenyek.telefon) LIKE '%Budapest%')) LIMIT 0 , 10;

A kérés 45mp-ig futott, ami ugy egy kicsit sok :)

Következő, talán életképesebb megoldás:

SELECT sx_intezmenyek. * , sx_telepulesek.telepules_nev FROM `sx_intezmenyek` , `sx_telepulesek` WHERE (sx_intezmenyek.irszam = sx_telepulesek.irszam AND ((sx_intezmenyek.intezmeny_nev LIKE '%Budapest%' OR sx_intezmenyek.irszam LIKE '%Budapest%' OR sx_telepulesek.telepules_nev LIKE '%Budapest%' OR sx_intezmenyek.cim LIKE '%Budapest%' OR sx_intezmenyek.kapcs_nev LIKE '%Budapest%' OR sx_intezmenyek.telefon LIKE '%Budapest%')) LIMIT 0 , 10;

Sajnos ennek a futási ideje még mindíg minimum 2mp.

Tettem indexet az adott mezőkre, de több ötlet egyenlőre nem jut eszembe mivel gyorsíthatnám a lekérést. Remélem tudtok segíteni!

Adatbázis: MySQL 5.0.85
 
1

Szerintem használj ON szerkezetet

laji · 2009. Okt. 11. (V), 15.59
Ha táblákat úgy fűzöl össze, hogy az összefűzések közötti kapcsolatokat csak a WHERE részben adod meg, akkor nagyon sok átmeneti sor keletkezik. Nézd meg az én kérdésem eggyel lejjebb (MySQL JOIN időköltsége. Hogyan ésszerűbb lekérdezni?)! Ez pont az, ami miatt a javasolt 3. megoldás kiesett. Tehát szerintem az 1. megoldás szerint, ON szerkezettel kell összefűzni össze a táblákat. Egyébként vizsgálathoz meg jól használható az "EXPLAIN EXTENDED SELECT..." képlet.
2

Cache mező, fulltext

vbence · 2009. Okt. 11. (V), 16.34
Logikus lenne a fulltext index használata. Ilyenkor számolnod kell olyan dolgokkal, hogy csk a teljes szóra lehet majd keresni, és fontos az adott mysql telepítés minimális szóhozza is (ennél kisebb szavakat nem indexel).

A másik, hogy készítesz egy cache mezőt, amibe minden módostáskor konkatenálod az adott mezőket. Így kevesebb like-ra van szükséged.
3

Valószínűleg

gabesz666 · 2009. Okt. 11. (V), 17.23
a másodikat fogom csinálni! Köszi!
4

Nem zárja ki egymást

vbence · 2009. Okt. 11. (V), 20.57
Tehetsz fulltext indexet a cache mezőre is. Ekkor a cache lényege az lesz, hogy a szótártáblákban tárolt adatokat is bemásolod magába a rekordba, a fulltext pedig gyorsabb lesz mint a like.