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

Sammensat FULLTEXT-indeks i MySQL

@Alden Quimbys svar er korrekt, så vidt det rækker, men der er mere i historien, for MySQL vil kun prøve at vælge det optimale indeks, og dets evne til at foretage denne bestemmelse er begrænset på grund af den måde, fuldtekstindekser interagerer med optimeringsværktøjet.

Hvad der rent faktisk sker er dette:

Hvis det angivne user_id findes i enten 0 eller 1 matchende rækker i tabellen, vil optimeringsværktøjet indse dette og vil vælge user_id som indeks for den forespørgsel. Hurtig udførelse.

Ellers vil optimeringsværktøjet vælge fuldtekstindekset og filtrere hver række, der matches af fuldtekstindekset, for at eliminere rækker, der ikke indeholder et user_id, der matcher WHERE-sætningen. Ikke helt så hurtigt.

Så det er ikke rigtig den "optimale" vej. Det er mere som fuldtekst, med en god optimering for at undgå fuldtekstsøgning under den ene betingelse, at vi ved, at vi næsten ikke har noget af interesse i tabellen.

Grunden til at dette går i stykker er, at et fuldtekstindeks ikke giver nogen meningsfuld statistik tilbage til optimeringsværktøjet. Der står bare "ja, jeg tror, ​​at forespørgslen nok kun skal kræve, at jeg tjekker 1 række" ... hvilket selvfølgelig glæder optimizeren meget, så fuldtekstindekset vinder buddet for laveste pris, medmindre indekset med heltal værdi er også forholdsvis lav eller lavere.

Alligevel betyder det ikke, at jeg ikke ville prøve det på denne måde først.

Der er en anden mulighed, som ville fungere bedst med fuldtekstforespørgsler IN BOOLEAN MODE og det er at oprette en anden kolonne, som du ville udfylde med noget som CONCAT('bruger_id_',bruger_id) eller noget lignende, og derefter erklære et 2-kolonne fuldtekstindeks.

filter_string VARCHAR(48) # populated with CONCAT('user_id_',user_id);
....
FULLTEXT KEY (message,filter_string)

Angiv derefter alt i forespørgslen.

SELECT ...
 WHERE user_id = 500 AND
 MATCH (message,filter_string) AGAINST ('+kittens +puppies +user_id_500' IN BOOLEAN MODE);

Nu vil fuldtekstindekset kun være ansvarligt for at matche de rækker, hvor killinger, hvalpe og "user_id_500" vises i det kombinerede fuldtekstindeks for de to kolonner, men du vil stadig gerne have heltalsfilteret der også for at sikre, at endelige resultater er begrænset på trods af enhver tilfældig forekomst af "user_id_500" i meddelelsen.



  1. Kunne ikke finde den lagrede procedure 'dbo.aspnet_CheckSchemaVersion'

  2. Håndtering af MySQL fuldtekst specialtegn

  3. Brug strtotime til datoer før 1970

  4. Sådan opretter du MySQL-visning