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:
- kolejność kolejności słów kluczowych jest krytycznym czynnikiem wydajność
- słowa kluczowe są używane w odwrotnej kolejności
- 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).
MyISAM odchodzi; zobacz, co otrzymasz z wariantem FULLTEXT InnoDB. –
@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
Czy możesz wysłać wynik polecenia EXPLAIN dla obu zapytań? – Stoleg