[rt-users] Re: query problem after 3.4.5 -> 3.6.4 upgrade

Nicholas Clark nick at ccl4.org
Mon Jul 23 12:03:29 EDT 2007


On Mon, Jul 23, 2007 at 04:59:27PM +0100, Nicholas Clark wrote:

> mysql> SELECT COUNT(DISTINCT main.id) FROM Tickets main CROSS JOIN Users Users_3 JOIN Groups Groups_1  ON ( Groups_1.Domain = 'RT::Ticket-Role' ) AND ( Groups_1.Type = 'Requestor' ) AND ( Groups_1.Instance = main.id ) JOIN CachedGroupMembers CachedGroupMembers_2  ON ( CachedGroupMembers_2.MemberId = Users_3.id ) AND ( CachedGroupMembers_2.GroupId = Groups_1.id )  WHERE (main.Status != 'deleted') AND ( ( Users_3.EmailAddress LIKE '%username%' AND CachedGroupMembers_2.id IS NOT NULL )  OR main.Status = 'new' OR main.Status = 'open') AND (main.Type = 'ticket') AND (main.EffectiveId = main.id);
> +-------------------------+
> | COUNT(DISTINCT main.id) |
> +-------------------------+
> |                    2777 | 
> +-------------------------+
> 1 row in set (12.87 sec)
> 
> mysql> 
> 
> 
> I'm just not sure
> 
> a: If the query is actually giving the same answer without the LEFT
> b: If so, how to patch DBIx::SearchBuilder to generate the better query.

Actually, turns out that you don't really need the index on MemberId, but
it saves about a second here:

mysql> explain SELECT COUNT(DISTINCT main.id) FROM Tickets main CROSS JOIN Users Users_3 JOIN Groups Groups_1  ON ( Groups_1.Domain = 'RT::Ticket-Role' ) AND ( Groups_1.Type = 'Requestor' ) AND ( Groups_1.Instance = main.id ) JOIN CachedGroupMembers CachedGroupMembers_2  ON ( CachedGroupMembers_2.MemberId = Users_3.id ) AND ( CachedGroupMembers_2.GroupId = Groups_1.id )  WHERE (main.Status != 'deleted') AND ( ( Users_3.EmailAddress LIKE '%username%' AND CachedGroupMembers_2.id IS NOT NULL )  OR main.Status = 'new' OR main.Status = 'open') AND (main.Type = 'ticket') AND (main.EffectiveId = main.id);

+----+-------------+----------------------+--------+----------------------------+------------+---------+-----------------------------------+-------+-------------+
| id | select_type | table                | type   | possible_keys              | key        | key_len | ref                               | rows  | Extra       |
+----+-------------+----------------------+--------+----------------------------+------------+---------+-----------------------------------+-------+-------------+
|  1 | SIMPLE      | Groups_1             | ref    | PRIMARY,Groups1,Groups2    | Groups2    |      65 | const                             | 58630 | Using where | 
|  1 | SIMPLE      | main                 | eq_ref | PRIMARY,Tickets4,Tickets5  | PRIMARY    |       4 | rt3.Groups_1.Instance             |     1 | Using where | 
|  1 | SIMPLE      | CachedGroupMembers_2 | ref    | PRIMARY,DisGrouMem,GrouMem | DisGrouMem |       5 | rt3.Groups_1.id                   |     2 | Using where | 
|  1 | SIMPLE      | Users_3              | eq_ref | PRIMARY,Users3             | PRIMARY    |       4 | rt3.CachedGroupMembers_2.MemberId |     1 | Using where | 
+----+-------------+----------------------+--------+----------------------------+------------+---------+-----------------------------------+-------+-------------+
4 rows in set (1.44 sec)

mysql> SELECT COUNT(DISTINCT main.id) FROM Tickets main CROSS JOIN Users Users_3 JOIN Groups Groups_1  ON ( Groups_1.Domain = 'RT::Ticket-Role' ) AND ( Groups_1.Type = 'Requestor' ) AND ( Groups_1.Instance = main.id ) JOIN CachedGroupMembers CachedGroupMembers_2  ON ( CachedGroupMembers_2.MemberId = Users_3.id ) AND ( CachedGroupMembers_2.GroupId = Groups_1.id )  WHERE (main.Status != 'deleted') AND ( ( Users_3.EmailAddress LIKE '%username%' AND CachedGroupMembers_2.id IS NOT NULL )  OR main.Status = 'new' OR main.Status = 'open') AND (main.Type = 'ticket') AND (main.EffectiveId = main.id);
+-------------------------+
| COUNT(DISTINCT main.id) |
+-------------------------+
|                    2777 | 
+-------------------------+
1 row in set (13.74 sec)


Nicholas Clark



More information about the rt-users mailing list