2017-01-21 38 views
6

Po zmianie kolejności słów kluczowych w wyszukiwaniu boolowskim uzyskuje się ten sam wynik, ale bardzo różne wyniki wydajności.Jakie są zasady zamawiania słów kluczowych w wyszukiwaniu boolean MySQL?

Profilowanie na MySQL 5.6.33 z tabeli MyISAM, ft_min_word_len=2 i description_index jako indeksu FULLTEXT na title i description zwrotów następująco:

# Query 1 
SELECT id 
FROM archive, topic 
WHERE topic.type=0 AND archive.status=2 
AND MATCH(title, description) AGAINST ('+house* +tz*' IN BOOLEAN MODE) 
AND archive.topicId = topic.id 
ORDER BY archive.featured DESC, archive.submissionDate DESC LIMIT 0,20 

Wynik:

Total count: 12 
Key_read_requests: 2384607 
Creating sort index: 7.950430 sec (!) 
Duration: 8.851252 sec 

# Query 2 
SELECT id 
FROM archive, topic 
WHERE topic.type=0 AND archive.status=2 
AND MATCH(title, description) AGAINST ('+tz* +house*' IN BOOLEAN MODE) 
AND archive.topicId = topic.id 
ORDER BY archive.featured DESC, archive.submissionDate DESC LIMIT 0,20 

Wynik:

Total count: 12 
Key_read_requests: 415 
Creating sort index: 0.003449 
Duration: 0.004054 sec 

Wszystkie wyniki za słowo:

tz*: 135092 
tz: 25596 
house*: 12 

Wyjaśnić jest taka sama dla obu zapytań:

id | select_type | Table | Type  | Key    | Key len | Ref    | Rows | Extra 
1 | SIMPLE  | archive | fulltext | description_index | 0  |     | 1 | Using where; Using filesort 
1 | SIMPLE  | topic | eq_ref | PRIMARY   | 3  | archive.topicId | 1 | Using where 

Tylko Key_read_requests i Creating sort index różnią się między 2 zapytaniami.

Wydaje się, że:

  1. kolejność kolejności słów kluczowych jest krytycznym czynnikiem wydajność
  2. słowa kluczowe są używane w odwrotnej kolejności
  3. posiadające najbardziej dyskryminujące kluczowe na końcu poprawia wydajność.

Pytania:

  • Jaki jest powód tej dużej różnicy wydajności?
  • Jakie są zasady/najlepsze praktyki? (Nie mogłem znaleźć niczego w dokumentacji mysql).
+0

MyISAM odchodzi; zobacz, co otrzymasz z wariantem FULLTEXT InnoDB. –

+0

@RickJames MyISAM jest nadal lepszy w niektórych sytuacjach (nasz przypadek). Czekamy na mysql 8, który wydaje się mieć świetne innodb perf. Do tego czasu musimy naprawić i zrozumieć ten problem. :) https: //www.percona.com/blog/2016/10/11/mysql-8-0-end-myisam/ – Toto

+0

Czy możesz wysłać wynik polecenia EXPLAIN dla obu zapytań? – Stoleg

Odpowiedz

-1

Czy uruchomiłeś oba zapytania względem nowo uruchomionej instancji? Jest możliwe, że zyskujesz wydajność plus napełniające się pamięci podręczne przy drugim uruchomieniu.

1

Edytuj po komentarzu OP:
Nie jestem pewien dokładnego planu kwerendy podczas rozwiązywania tego zapytania.
Czasami jedna operacja jest droższa od innej, dlatego wykonanie tańszej operacji może najpierw rozwiązać wiele wierszy, które następnie nie muszą przechodzić przez droższą operację, co prowadzi do skrócenia czasu działania.
(W twoim przykładzie jedna z operacji dopasowywania może być droższa od drugiej, co zwiększa i redukuje czas działania, zmieniając kolejność łańcuchów, aby dopasować się do nich).

+0

Rozumiem problem liczności. :) Prawdziwe pytanie brzmi: Czy słowa kluczowe * zawsze * są wyszukiwane w odwrotnej kolejności (w 'trybie boolowskim')? Ponieważ, jeśli tak jest, muszę przebudować zapytanie, aby posortować słowa kluczowe od mniejszego sekrowania do najbardziej. – Toto

+0

Przepraszamy, popełniłem straszny błąd w moim pytaniu (naprawiono teraz). Te 3 wartości nie były liczbą, ale liczbą rekordów pasujących do słowa kluczowego. :( – Toto

+1

Ok, nie ma problemu.Zaprojektowałem moją odpowiedź Też zapomniałem trochę o tym, co napisałeś – iLikeMySql