sql >> Databasteknik >  >> RDS >> Mysql

Sammansatt FULLTEXT-index i MySQL

@Alden Quimbys svar är korrekt så långt det går, men det finns mer i historien, eftersom MySQL bara kommer att försöka att välja det optimala indexet, och dess förmåga att göra det beslutet är begränsad på grund av hur fulltextindex interagerar med optimeraren.

Vad som faktiskt händer är detta:

Om det angivna user_id finns i antingen 0 eller 1 matchande rader i tabellen, kommer optimeraren att inse detta och kommer att välja user_id som index för den frågan. Snabbt utförande.

Annars kommer optimeraren att välja fulltextindexet och filtrera varje rad som matchas av fulltextindexet för att eliminera rader som inte innehåller ett user_id som matchar WHERE-satsen. Inte riktigt lika snabbt.

Så det är inte riktigt den "optimala" vägen. Det är mer som fulltext, med en trevlig optimering för att undvika fulltextsökning under det ena villkoret att vi vet att vi nästan inte har något av intresse i tabellen.

Anledningen till att detta går sönder är att ett fulltextindex inte ger någon meningsfull statistik tillbaka till optimeraren. Det står bara "ja, jag tror att frågan förmodligen bara borde kräva att jag kontrollerar 1 rad" ... vilket naturligtvis gläder optimeraren mycket, så fulltextindexet vinner budet för lägsta kostnad, om inte indexet med heltal värdet är också jämförbart lågt eller lägre.

Det betyder ändå inte att jag inte skulle prova på det här sättet först.

Det finns ett annat alternativ som skulle fungera bäst med fulltextfrågor IN BOOLEAN MODE och det är att skapa en annan kolumn som du skulle fylla med något som CONCAT('user_id_',user_id) eller något liknande, och sedan deklarera ett 2-kolumns fulltextindex.

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

Ange sedan allt i frågan.

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

Nu kommer fulltextindexet att vara ansvarigt för att endast matcha de rader där kattungar, valpar och "user_id_500" visas i det kombinerade fulltextindexet för de två kolumnerna, men du skulle fortfarande vilja ha heltalsfiltret där också för att säkerställa att slutresultaten är begränsade trots att "user_id_500" förekommer slumpmässigt i meddelandet.



  1. Hur man använder GROUP BY i en fråga när man använder variabler

  2. Upptäck sammanställning av en MySQL-kolumn

  3. Returnera en procentandel av en resultatuppsättning i SQL Server

  4. Routing med AngularJS och Slim PHP