article
-id
-title fulltext
-content fulltext
-status index
tag
-id
-name fulltext
article_tag
-id
-tagId
-articleId
i chciałbym wyciągnąć wpisy które mogą zawierać jakąś frazę (gdzie fraz może być do 10 różnych) w article.title, article.content bądź w przypisanym tagu gdzie artykuł ma status 1 i posortowane po ilości trafień
Na razie mam takie zapytania
zliczenie wyników
SELECT SQL_NO_CACHE count(DISTINCT article.id) AS number FROM article LEFT JOIN article_tag ON (article_tag.articleId = article.id) LEFT JOIN tags ON (tags.id = article_tag.tagId) WHERE article.STATUS = 1 AND (match(article.title, article.content, tags.name) against ("gggg*" IN BOOLEAN mode))>0
SELECT SQL_NO_CACHE DISTINCT article.id, article.title, article.img, article.published, article.content, article.vote_false, article.vote_true, article.imgSource, match(article.title, article.content, tags.name) against ("gggg*" IN BOOLEAN mode) AS sort FROM article LEFT JOIN article_tag ON (article_tag.articleId = article.id) LEFT JOIN tags ON (tags.id = article_tag.tagId) WHERE article.STATUS = 1 AND match(article.title, article.content, tags.name) against ("gggg*" IN BOOLEAN mode) HAVING sort>0 ORDER BY sort DESC, article.published DESC LIMIT 0,10;
ale przy bazie 30 000 tagów, 100 000 powiązań, 30 000 artykułów oba zapytanie wykonują się ponad 3 sekundy