つまり、基本的に、URLとTAGSを含む2つのテーブルがあり、結合テーブルTAGS_URLSを介して2つの間にhas-and-belongs-to-manyの関係があります。
タグでURLを検索する簡単なクエリは次のようになります。
SELECT urls.id FROM urls
INNER JOIN tags_urls ON urls.id=tags_urls.url_id
INNER JOIN tags ON tags_urls.tag_id=tags.id
WHERE tags.tag IN ("sample","tag","list");
ただし、すべてのタグセットを含むすべてのURLの共通部分を復元しようとしています。つまり、タグ「sample」AND「tag」AND「list」を含むURLのみです。
動作するクエリがありますが、30秒以内にクエリを実行できません。
SELECT a.id
FROM
(SELECT DISTINCT urls.id FROM urls
INNER JOIN tags_urls ON tags_urls.url_id=urls.id INNER JOIN tags ON tags.id=tags_urls.tag_id
WHERE tags.tag = 'sample') a
JOIN
(SELECT DISTINCT urls.id FROM urls
INNER JOIN tags_urls ON tags_urls.url_id=urls.id INNER JOIN tags ON tags.id=tags_urls.tag_id
WHERE tags.tag = 'list') b
ON a.id = b.id;
結果セットは正しいですが、パフォーマンスは恐ろしいものです。
また、現在、タグセットに保存されているURL IDのリストとしてRedisデータベースにデータを複製しているので、このようなことを実行して、非常に迅速に結果セットを取得できます。
SINTER "tag-sample" "tag-list"
合理的な努力で、このタスクのMySQLパフォーマンスをSINTERを使用してRedisレベルまで上げることは可能でしょうか?