Homec4science

Faster Query for Differential Updates

Authored by elynde <elynde@facebook.com> on Apr 30 2011, 00:37.

Description

Faster Query for Differential Updates

Summary:
The old query was effectively

SELECT DISTINCT revision.* FROM differential_revision revision

JOIN `differential_relationship` relationship ON

(relationship.revisionID = revision.id

AND relationship.objectPHID in

('PHID-USER-a113b9ae4ee9524d0a20'))

  OR revision.authorPHID = 'PHID-USER-a113b9ae4ee9524d0a20'
LEFT JOIN `differential_viewtime` viewtime ON

viewtime.viewerPHID in ('PHID-USER-a113b9ae4ee9524d0a20')

AND viewtime.objectPHID = revision.phid
AND GREATEST(1304022277, IFNULL(viewtime.viewTime, 0)) <

revision.dateModified

ORDER BY dateModified DESC;

I'm not a db performance expert but it looks like the problem is that we
have to scan all revisions

mysql> EXPLAIN SELECT DISTINCT revision.* FROM `differential_revision`

revision JOIN differential_relationship relationship ON
(relationship.revisionID = revision.id AND relationship.objectPHID
in ('PHID-USER-a113b9ae4ee9524d0a20')) OR revision.authorPHID =
'PHID-USER-a113b9ae4ee9524d0a20' LEFT JOIN differential_viewtime
viewtime ON viewtime.viewerPHID in ('PHID-USER-a113b9ae4ee9524d0a20')
AND viewtime.objectPHID = revision.phid AND GREATEST(1304022277,
IFNULL(viewtime.viewTime, 0)) < revision.dateModified ORDER BY
dateModified DESC;

+----+-------------+--------------+-------+--------------------+------------+---------+-------+--------+------------------------------------+

| id | select_type | table        | type  | possible_keys      | key        |

key_len | ref | rows | Extra |

+----+-------------+--------------+-------+--------------------+------------+---------+-------+--------+------------------------------------+

|  1 | SIMPLE      | revision     | ALL   | PRIMARY,authorPHID | NULL       |

NULL | NULL | 254127 | Using temporary; Using filesort |

|  1 | SIMPLE      | viewtime     | ref   | PRIMARY            | PRIMARY    |

66 | const | 17 | Distinct |

|  1 | SIMPLE      | relationship | index | PRIMARY,objectPHID | objectPHID |

72 | NULL | 966900 | Using where; Using index; Distinct |

+----+-------------+--------------+-------+--------------------+------------+---------+-------+--------+------------------------------------+

The new query is a lot faster

mysql> EXPLAIN SELECT revs.* FROM ( (SELECT revision.* FROM

differential_revision revision WHERE revision.authorPHID in
('PHID-USER-a113b9ae4ee9524d0a20')) UNION (SELECT revision.* FROM
differential_revision revision JOIN differential_relationship rel WHERE
rel.revisionId = revision.Id AND rel.objectPHID =
'PHID-USER-a113b9ae4ee9524d0a20')) as revs LEFT JOIN differential_viewtime
viewtime ON viewtime.viewerPHID = 'PHID-USER-a113b9ae4ee9524d0a20' AND
viewtime.objectPHID = revs.phid WHERE GREATEST(1304022277,
IFNULL(viewtime.viewTime, 0)) < revs.dateModified ORDER BY revs.dateModified;

+----+--------------+------------+--------+--------------------+------------+---------+-----------------------------------------+------+--------------------------+

| id | select_type  | table      | type   | possible_keys      | key        |

key_len | ref | rows | Extra

|

+----+--------------+------------+--------+--------------------+------------+---------+-----------------------------------------+------+--------------------------+

|  1 | PRIMARY      | <derived2> | ALL    | NULL               | NULL       |

NULL | NULL | 3021 | Using filesort

 |
|  1 | PRIMARY      | viewtime   | ref    | PRIMARY            | PRIMARY    |

66 | const | 17 | Using where

 |
|  2 | DERIVED      | revision   | ref    | authorPHID         | authorPHID |

67 | | 1040 | Using where

 |
|  3 | UNION        | rel        | ref    | PRIMARY,objectPHID | objectPHID |

66 | | 3822 | Using where; Using
index |

|  3 | UNION        | revision   | eq_ref | PRIMARY            | PRIMARY    |

4 | phabricator_differential.rel.revisionID | 1 |

 |
| NULL | UNION RESULT | <union2,3> | ALL    | NULL               | NULL
NULLNULLNULL

+----+--------------+------------+--------+--------------------+------------+---------+-----------------------------------------+------+--------------------------+

Test Plan:
Loaded differential updates with new query, made sure page loaded quickly. Ran
the query from the command-line, it took about .4 seconds.

Reviewed By: Girish
Reviewers: tuomaspelkonen, jungejason, Girish
Commenters: btrahan
CC: aran, btrahan, elynde, Girish
Differential Revision: 181

Details

Committed
elynde <elynde@facebook.com>May 4 2011, 00:00
Pushed
aubortJan 31 2017, 17:16
Parents
rPH2e96565f675d: Faster 'All Revisions and Reviews' Query
Branches
Unknown
Tags
Unknown

Event Timeline

elynde <elynde@facebook.com> committed rPH72dec7cd2507: Faster Query for Differential Updates (authored by elynde <elynde@facebook.com>).May 4 2011, 00:00