slow mysql count because of subselect

Posted by frgt10 on Stack Overflow See other posts from Stack Overflow or by frgt10
Published on 2011-01-12T09:19:23Z Indexed on 2011/01/12 10:53 UTC
Read the original article Hit count: 183

Filed under:
|
|

how to make this select statement more faster? the first left join with the subselect is making it slower...

mysql>   SELECT COUNT(DISTINCT w1.id) AS AMOUNT FROM tblWerbemittel w1
    JOIN tblVorgang v1 ON w1.object_group = v1.werbemittel_id
    INNER JOIN ( SELECT wmax.object_group, MAX( wmax.object_revision ) wmaxobjrev FROM tblWerbemittel wmax GROUP BY wmax.object_group ) AS wmaxselect ON w1.object_group = wmaxselect.object_group AND w1.object_revision = wmaxselect.wmaxobjrev
    LEFT JOIN ( SELECT vmax.object_group, MAX( vmax.object_revision ) vmaxobjrev FROM tblVorgang vmax GROUP BY vmax.object_group ) AS vmaxselect ON v1.object_group = vmaxselect.object_group AND v1.object_revision = vmaxselect.vmaxobjrev
    LEFT JOIN tblWerbemittel_has_tblAngebot wha ON wha.werbemittel_id = w1.object_group
    LEFT JOIN tblAngebot ta ON ta.id = wha.angebot_id
    LEFT JOIN tblLieferanten tl ON tl.id = ta.lieferant_id AND wha.zuschlag = (SELECT MAX(zuschlag) FROM tblWerbemittel_has_tblAngebot WHERE werbemittel_id = w1.object_group)
    WHERE w1.flags =0 AND v1.flags=0;

        +--------+
        | AMOUNT |
        +--------+
        |   1982 |
        +--------+
        1 row in set (1.30 sec)

Some indexes has been already set and as EXPLAIN shows they were used.

+----+--------------------+-------------------------------+--------+----------------------------------------+----------------------+---------+-----------------------------------------------+------+----------------------------------------------+
| id | select_type        | table                         | type   | possible_keys                          | key                  | key_len | ref                                           | rows | Extra                                        |
+----+--------------------+-------------------------------+--------+----------------------------------------+----------------------+---------+-----------------------------------------------+------+----------------------------------------------+
|  1 | PRIMARY            | <derived2>                    | ALL    | NULL                                   | NULL                 | NULL    | NULL                                          | 2072 |                                              |
|  1 | PRIMARY            | v1                            | ref    | werbemittel_group,werbemittel_id_index | werbemittel_group    | 4       | wmaxselect.object_group                       |    2 | Using where                                  |
|  1 | PRIMARY            | <derived3>                    | ALL    | NULL                                   | NULL                 | NULL    | NULL                                          | 3376 |                                              |
|  1 | PRIMARY            | w1                            | eq_ref | object_revision,or_og_index            | object_revision      | 8       | wmaxselect.wmaxobjrev,wmaxselect.object_group |    1 | Using where                                  |
|  1 | PRIMARY            | wha                           | ref    | PRIMARY,werbemittel_id_index           | werbemittel_id_index | 4       | dpd.w1.object_group                           |    1 |                                              |
|  1 | PRIMARY            | ta                            | eq_ref | PRIMARY                                | PRIMARY              | 4       | dpd.wha.angebot_id                            |    1 |                                              |
|  1 | PRIMARY            | tl                            | eq_ref | PRIMARY                                | PRIMARY              | 4       | dpd.ta.lieferant_id                           |    1 | Using index                                  |
|  4 | DEPENDENT SUBQUERY | tblWerbemittel_has_tblAngebot | ref    | PRIMARY,werbemittel_id_index           | werbemittel_id_index | 4       | dpd.w1.object_group                           |    1 |                                              |
|  3 | DERIVED            | vmax                          | index  | NULL                                   | object_revision_uq   | 8       | NULL                                          | 4668 | Using index; Using temporary; Using filesort |
|  2 | DERIVED            | wmax                          | range  | NULL                                   | or_og_index          | 4       | NULL                                          | 2168 | Using index for group-by                     |
+----+--------------------+-------------------------------+--------+----------------------------------------+----------------------+---------+-----------------------------------------------+------+----------------------------------------------+
10 rows in set (0.01 sec)

The main problem while the statement above takes about 2 seconds seems to be the subselect where no index can be used. How to write the statement even more faster?

Thanks for help. MT

© Stack Overflow or respective owner

Related posts about mysql

Related posts about index