Om du måste använda regexp-stil WHERE
klausuler kommer du definitivt att plågas av problem med långsamma frågor. För att sökning i regexp-stil ska fungera måste MySQL jämföra alla värden i din namnkolumn med regexp. Och din fråga har fördubblat besväret genom att även titta på kolumnen för användarnamn.
Detta innebär att MySQL inte kan dra nytta av några index, vilket är hur alla DBMS snabbar upp sökningar av stora tabeller.
Det finns några saker du kan prova. Alla handlar om att säga adjö till REGEXP.
En är denna:
WHERE name LIKE CONCAT('jack', '%') OR username LIKE CONCAT('jack', '%')
Om du skapar index på dina namn- och användarnamnskolumner bör detta gå hyfsat snabbt. Det kommer att leta efter alla namn/användarnamn som börjar med "jack". NOTERA att
WHERE name LIKE CONCAT('%','jack') /* SLOW!!! */
kommer att leta efter namn som slutar med 'jack' men kommer att vara långsam som din sökning i regexp-stil.
En annan sak du kan göra är att ta reda på varför din applikation måste kunna söka efter en del av ett namn eller användarnamn. Du kan antingen ta bort den här funktionen från din applikation eller komma på något bättre sätt att hantera den.
Möjliga bättre sätt:
- Be dina användare att dela upp sina namn i förnamns- och efternamnsfält och sök separat.
- Skapa en separat "sök alla användare"-funktion som bara används när en användare behöver den, och därigenom minska frekvensen av din långsamma regexp-stil fråga.
- Dela upp deras namn i en separat namn-ordstabell själv med hjälp av något slags förbearbetningsprogram. Sök i namn-ord-tabellen utan regexp.
- Ta reda på hur du använder MySQL fulltextsökning för den här funktionen.
Alla dessa involverar en del programmeringsarbete.