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

MySQL fuldtekstsøgning over flere kolonner:resultatforvirring

Det ser ud til, at InnoDB-tabeller ikke tillader søgninger over flere fuldtekstindekser i samme MATCH() tilstand.

Her hører dine felter ikke alle til den samme tabel, derfor er de dækket af forskellige indekser. Bemærk, at den samme begrænsning gælder, hvis du havde en tabel som denne:

CREATE TABLE t (
  f1 VARCHAR(20),
  f2 VARCHAR(20),
  FULLTEXT(f1), FULLTEXT(f2)
) ENGINE=InnoDB;

SELECT * FROM t
WHERE MATCH(f1, f2) AGAINST ('something in f2'); -- likely to return no row

Det ligner en fuldtekstsøgning kan kun søge på det første fuldtekstindeks, den støder på men dette er kun noget, jeg trækker fra fra denne oplevelse , vær venlig ikke at tage dette for givet.

Den nederste linje er, at du bør opdele din søgning, så du bruger et enkelt fuldtekstindeks pr. MATCH() klausul:

SELECT * FROM auction, user, gallery, ...
WHERE
    MATCH(auction.field1, auction.field2) AGAINST ('search query' IN BOOLEAN MODE) OR
    MATCH(auction.field3) AGAINST ('search query' IN BOOLEAN MODE) OR
    MATCH(user.field1, user.field2, user.field3) AGAINST...

Dette er en illustration af en mulig forespørgsel, hvis du havde to forskellige indekser på auction og en på user . Du skal tilpasse den til din faktiske struktur (send venligst dine tabellers beskrivelser, hvis du har brug for mere vejledning).

Bemærk, at dette kun gælder for InnoDB-tabeller. Interessant nok ser MyISAM-tabeller ikke ud til at vise den samme begrænsning .

Opdatering:det viser sig, at dette var en fejl i InnoDB-motoren , fastsat i 5.6.13/5.7.2. Ovenstående eksempel fejler nu med rette med "Kan ikke finde FULLTEXT-indekset, der matcher kolonnelisten". Der er faktisk ikke noget indeks på (f1, f2) , men en på (f1) og en anden på (f2) . Som ændringsloggen anbefaler :

Det er bemærkelsesværdigt, at selvom sådanne forespørgsler returnerer et korrekt resultatsæt med MyISAM, kører de langsommere, end man kunne forvente, som de ignorerer stille eksisterende fuldtekstindekser .




  1. Slet data fra alle tabeller i MYSQL

  2. HTML-indtastningsformularfelt udfylder ikke PHP-værdi efter første mellemrum

  3. Sådan undslipper du enkelte citater i MySQL

  4. DB design:medlemmer tabel separate eller alle i én tabel?