[Dbix-class] Mysql / mariadb and subqueries

Andrew Beverley andy at andybev.com
Mon Feb 22 14:02:26 GMT 2021


Dear list,

In my application, DBIx::Class is generating WHERE clauses using
subqueries. With a lot of rows in the database this performs really
badly in MariaDB [1], so I'm wondering whether there is a way to
get DBIx::Class to produce the equivalent queries by joins or whether
there are any other solutions.

Here is the code. The "tracks" table contains millions of rows, but
there are only a very small number that will be deleted as a result of
the query:

  $schema->resultset('Track')->search({
    'cd.artist_id' => 20,
  },{
    join => 'cd',
  })->delete;

Which produces this SQL:

  DELETE FROM tracks
    WHERE ( id IN (
      SELECT * FROM (
        SELECT me.id FROM tracks me JOIN cds cd ON cd.id = me.cd_id WHERE ( cd.artist_id = 20 )
      ) _forced_double_subquery
    )  );

But this would be much, much quicker:

  DELETE tracks FROM tracks
    LEFT JOIN cds ON cds.id=tracks.cd_id
    WHERE cds.artist_id = 20

Any ideas how I can optimise this without writing raw SQL or changing
databases?

Thanks,

Andy

[1] https://stackoverflow.com/questions/7361174




More information about the DBIx-Class mailing list