Als u regexp-stijl WHERE
moet gebruiken clausules, zult u zeker worden geplaagd door problemen met langzame query's. Om zoeken in regexp-stijl te laten werken, moet MySQL elke waarde in uw naamkolom vergelijken met de regexp. En uw zoekopdracht heeft de moeite verdubbeld door ook naar uw gebruikersnaamkolom te kijken.
Dit betekent dat MySQL geen gebruik kan maken van indexen, en dat is hoe alle DBMS'en het opvragen van grote tabellen versnellen.
Er zijn een paar dingen die je kunt proberen. Ze hebben allemaal te maken met afscheid nemen van REGEXP.
Een daarvan is deze:
WHERE name LIKE CONCAT('jack', '%') OR username LIKE CONCAT('jack', '%')
Als u indexen maakt op uw naam- en gebruikersnaamkolommen, zou dit behoorlijk snel moeten zijn. Het zoekt naar alle namen/gebruikersnamen die beginnen met 'jack'. LET OP dat
WHERE name LIKE CONCAT('%','jack') /* SLOW!!! */
zal zoeken naar namen die eindigen op 'jack', maar zal traag zijn zoals uw zoekopdracht in regexp-stijl.
Een ander ding dat u kunt doen, is uitzoeken waarom uw toepassing moet kunnen zoeken naar een deel van een naam of gebruikersnaam. U kunt deze functie uit uw toepassing verwijderen of een betere manier bedenken om ermee om te gaan.
Mogelijke betere manieren:
- Vraag uw gebruikers om hun namen op te splitsen in velden voor voornaam en achternaam en afzonderlijk te zoeken.
- Maak een aparte functie voor het doorzoeken van alle gebruikers die alleen wordt gebruikt wanneer een gebruiker deze nodig heeft, waardoor de frequentie van uw langzame zoekopdracht in regexp-stijl wordt verminderd.
- Breek hun namen zelf op in een aparte naam-woordentabel met behulp van een soort voorbewerkingsprogramma. Zoek in de naam-woordentabel zonder regexp.
- Ontdek hoe u MySQL full text search kunt gebruiken voor deze functie.
Dit alles brengt wat programmeerwerk met zich mee.