简体   繁体   中英

more efficient inner join query

Is that possible to make this query more efficient ?

SELECT DISTINCT(static.template.name) 
FROM probedata.probe 
INNER JOIN static.template ON probedata.probe.template_fk = static.template.pk 
WHERE creation_time >=  DATE_SUB(NOW(), INTERVAL 6 MONTH)

Thanks.

First, I'm going to rewrite it using table aliases, so I can read it:

SELECT DISTINCT(t.name) 
FROM probedata.probe p INNER JOIN
     static.template t
     ON p.template_fk = t.pk 
WHERE creation_time >=  DATE_SUB(NOW(), INTERVAL 6 MONTH);

Let me make two assumptions:

  • name is unique in static.template
  • creation_time comes from probe

The first assumption is particularly useful. You can rewrite the query as:

SELECT t.name
FROM static.template t
WHERE EXISTS (SELECT 1
              FROM probedata.probe p  
              WHERE p.template_fk = t.pk AND
                    p.creation_time >=  DATE_SUB(NOW(), INTERVAL 6 MONTH)
             );

The second assumption only affects the indexing. For this query, you want indexes on probe(template_fk, creation_time) .

If template has wide records, then an index on template(pk, name) might also prove useful.

This will change the execution plan to be a scan of the template table with a fast look up using the index into the probe table. There will be no additional processing to remove duplicates.

Could help:

  1. If you use this statement in a script, assign the result of the DATE_SUB(NOW(), INTERVAL 6 MONTH) in a variable before the select statement and use that variable in the where condition (because the functions to calculate last X months would execute just once)
  2. Instead of distinct, try and see if there is an improvement using just the column in the select clause (so no distinct) and add the GROUP BY static.template.name

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM