2016-08-17 26 views
7

W mojej bazie danych mam tabelę zawierającą identyfikator firmy, wskazującą firmę i tekst. Chciałbym wykonać wyszukiwanie FULLTEXT, ale ponieważ zawsze wysyłam żądania na konkretny identyfikator companyId, chciałbym użyć klucza złożonego, który łączy mój identyfikator companyId i fulltext. Czy jest to mimo wszystko? Jak sądzę, nie jest to możliwe, jaki jest optymalny sposób tworzenia indeksów, aby następująca kwerenda była najszybsza?Indeks pełnego tekstu w połączeniu z normalnym indeksem

Żądanie zawsze będzie

SELECT * FROM textTable 
WHERE companyId = ? (Possibly more conditions) AND 
    MATCH(value) AGAINST("example") 

Czy mogę tworzyć moje indeksy na kolumnach całkowitych normalnie i dodać jeden indeks pełny? lub czy powinienem dołączyć kolumnę value do indeksu? Może obydwa ?

+0

Dlaczego nie utworzyć obu, pokazać plan wykonania, aby sprawdzić, który indeks jest używany, a następnie zdecydować? – trincot

+0

Czy to już sprawdziłeś? http://stackoverflow.com/questions/1173418/sql-server-normal-index-vs-fulltext-index także to (zauważ, że to jest ponad 3 lata, chociaż): https://makandracards.com/makandra/12813 - analiza wydajności-of-mysql-s-fulltext-indexes-i-like-query-for-full-text-search –

+0

@trincot Mogę to zrobić dla indeksów, które mam na myśli, ale nie będę w stanie tworzyć indeksy, o których nie myślałem. Próbuję uzyskać wgląd, którego sam nie mogę znaleźć. p.marino: Moje pytanie nie dotyczy określenia, czy powinienem używać pełnotekstowego indeksu lub normalnego, ale jak utworzyć klucz złożony, który je łączy (i jeśli nie mogę, najbliższe podejście) – hilnius

Odpowiedz

0

Dlaczego wybierasz wszystko? to nie pomoże twojej wydajności zapytań. Musisz wybrać tylko te kolumny, które potrzebujesz. Spowoduje to zmniejszenie czasu potrzebnego na skanowanie tabeli.

W przypadku wyszukiwania FULLTEXT Twoja metoda sortuje wyniki według trafności, a następnie korzysta z wyszukiwania indeksu w oparciu o klauzulę WHERE. Tak więc, musisz przywrócić to do bezpośredniego wyszukiwania przez dodanie indeksu w klauzuli SELECT.

Zapytanie powinno być coś takiego:

SELECT 
    MATCH(value) AGAINST("example") 
FROM 
    textTable 

można dodać więcej filtrowanie na podstawie klauzuli WHERE, lub lepiej można wiązać IF lub CASE lub wszelkie inne funkcje, jeśli będzie.

coś takiego:

SELECT 
    IF(MATCH(value) AGAINST("example"), 'Your Returned value if TRUE', 'Your returned value if FALSE') 
FROM textTable 

to zrobi pełne skanowanie tabeli, i to szybciej.

Dla części indeksowania, Możesz użyć indeksu na identyfikatorze firmy i podać wartość z nim. Możesz zrobić to samo z innymi kolumnami, których używasz w SELECT, WHERE i ORDER BY.