Table 1: Tracks
Table 2: List of words
Table 3: N: M Track contains words (track words)
Find all the tracks that have all the words.
currently the request looks like this:
SELECT DISTINCT t.id FROM track as t Left Join trackwords as tw ON t.id=tw.trackid Left Join wordlist as wl on wl.id=tw.wordid WHERE wl.trackusecount>0 group by t.id HAVING SUM(IF(wl.word IN ('folsom','prison','blues'),1,0)) = 3;
Which according to EXPLAIN uses all the necessary indexes:
+----+-------------+-------+--------+-----------------------+---------+---------+----------------+---------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+--------+-----------------------+---------+---------+----------------+---------+-------------+ | 1 | SIMPLE | t | index | PRIMARY | PRIMARY | 4 | NULL | 8194507 | Using index | | 1 | SIMPLE | tw | ref | wordid,trackid | trackid | 4 | mbdb.t.id | 3 | Using where | | 1 | SIMPLE | wl | eq_ref | PRIMARY,trackusecount | PRIMARY | 4 | mbdb.tw.wordid | 1 | Using where | +----+-------------+-------+--------+-----------------------+---------+---------+----------------+---------+-------------+
But the request takes a lot of time. Any suggestion to expedite the request?
source share