>The way it works now is that this query is run after every track is added, 
>when there is not an explicit COMPILATION tag present.  So it gets run once 
>per track.  The results from the query are longer for each subsequent track in 
>a given album, but unless you have an album with a ton of tracks that's not a 
>big deal.  I benchmarked this today and it's actually not that slow, so maybe 
>the drastic slowdown came from somewhere else.  I need to do some more testing.
>
My initial thoughts were pretty much the same as Erland's.  I tried adjusting 
the query to use a join, and it appeared to be slightly faster in MySQL:

        SELECT contributor, track
        FROM contributor_track AS ct
                JOIN tracks AS t ON t.id = ct.track AND t.album = ?
        WHERE ct.role = ?

I wondered if the ORDER BY was really needed?  I was also going to check the 
indexes in MySQL to see if there was soemthing that could be done.

But the real problem is executing the query many times - once per track on each 
album.  That must be a big overhead.

So, how about doing it all in one query:

SELECT album_id
FROM
(
  SELECT album_id
  FROM
  (
    SELECT a.id AS album_id, ct.contributor, count(t.id) AS track_count
    FROM albums AS a
        JOIN tracks AS t ON t.album = a.id
        JOIN contributor_track AS ct ON t.id = ct.track AND role = 1
    WHERE a.compilation IS NULL
      AND (SELECT COUNT(contributor) FROM contributor_album WHERE album = a.id 
AND role = 1) > 1
    GROUP BY a.id, ct.contributor
  ) AS a
  GROUP BY album_id, track_count
) AS a
GROUP BY album_id
HAVING COUNT(*) > 1

That runs in a few milliseconds, and should run on both MySQL and Sqlite.

Then turn that into an UPDATE query that sets COMPILATION=1.

I've used role=1 to only look for artist contributors.  This could be IN (1, 2, 
3, 4) to include composers, conductors and band/orchestra.  But I wonder how 
the scanner currently considers these different contributor roles - does it 
matter if different tracks have the same set of contributors but different 
contributor roles?  i.e. if Mozart exists on some tracks as composer and on 
other tracks as an artist role, but effectively appears as a contributor once 
on each track on an album?

_______________________________________________
beta mailing list
[email protected]
http://lists.slimdevices.com/mailman/listinfo/beta

Reply via email to