sql >> Database teknologi >  >> RDS >> Mysql

Mysql optimering til REGEXP

Hvis du skal bruge regexp-stil WHERE klausuler, vil du helt sikkert blive plaget af problemer med langsomme forespørgsler. For at søgning i regexp-stil skal fungere, skal MySQL sammenligne hver værdi i din navnekolonne med regexp. Og din forespørgsel har fordoblet besværet ved også at se på din brugernavn-kolonne.

Dette betyder, at MySQL ikke kan drage fordel af nogen indekser, hvilket er hvordan alle DBMS'er fremskynder forespørgsler i store tabeller.

Der er et par ting, du kan prøve. Alle involverer det at sige farvel til REGEXP.

Den ene er denne:

WHERE name LIKE CONCAT('jack', '%') OR username LIKE CONCAT('jack', '%')

Hvis du opretter indekser på dine navne- og brugernavnskolonner, burde dette være anstændigt hurtigt. Det vil lede efter alle navne/brugernavne, der begynder med 'jack'. BEMÆRK at

WHERE name LIKE CONCAT('%','jack') /* SLOW!!! */

vil lede efter navne, der ender med 'jack', men vil være langsom ligesom din søgning i regexp-stil.

En anden ting, du kan gøre, er at finde ud af, hvorfor din applikation skal kunne søge efter en del af et navn eller brugernavn. Du kan enten fjerne denne funktion fra din applikation eller finde ud af en bedre måde at håndtere den på.

Mulige bedre måder:

  1. Bed dine brugere om at opdele deres navne i felter for fornavn og efternavn, og søg separat.
  2. Opret en separat "søg alle brugere"-funktion, der kun bliver brugt, når en bruger har brug for det, og derved reducere hyppigheden af ​​din langsomme forespørgsel i regexp-stil.
  3. Opdel selv deres navne i en separat navne-ord-tabel ved hjælp af en form for forbehandlingsprogram. Søg i navnet-ord-tabellen uden regexp.
  4. Find ud af, hvordan du bruger MySQL fuldtekstsøgning til denne funktion.

Alle disse involverer noget programmeringsarbejde.



  1. En oversigt over klynge-til-klynge-replikering

  2. Ændring af MySQL-tidszone?

  3. alternativer til REPLACE på en tekst eller ntext datatype

  4. Ret "dato er inkompatibel med int" i SQL Server, når du tilføjer til eller trækker fra en dato