I've investigated more on this problem and found out that this problem
of mysql as couldn't optimize well some queries when it's possible, I
know how to hack a workaround and help RDBMs optimize it, but later...
-EHAVENOTIME

On 3/29/06, Laas Toom <[EMAIL PROTECTED]> wrote:
Tuesday 28 March 2006 7:01 pm Ruslan Zakirov wrote:
> Could you show full explain for the query?

Unfortunately (or fortunately ;-) the query now is planned differently than,
when I began testing yesterday so I can not give you the very first explain
output, where the 'main' table was joined in first and which took 8 sec to
complete.

But below are two different EXPLAINs which I can get right now.
(Use fixed-font to view these tabels, but I also included URLs for screenshots
of the same tables)

1) The way this query is run now on our server. This query takes 1.5 sec to
complete and after some runs gets even faster (caching probably).

http://www3.eenet.ee/~laas/explain_select_owners_1.png

SQL query:
EXPLAIN SELECT DISTINCT main.* FROM Users main, Principals Principals_1, ACL
ACL_2, CachedGroupMembers CachedGroupMembers_3 WHERE ((ACL_2.PrincipalId =
CachedGroupMembers_3.GroupId)) AND ((ACL_2.PrincipalType = 'Group')) AND
((ACL_2.RightName = 'OwnTicket')) AND ((CachedGroupMembers_3.MemberId =
Principals_1.id)) AND ((Principals_1.Disabled = '0')) AND
((Principals_1.PrincipalType = 'User')) AND ((Principals_1.id != '1')) AND
((main.id = Principals_1.id)) AND ((ACL_2.ObjectType = 'RT::Ticket' AND
ACL_2.ObjectId = 1365) OR (ACL_2.ObjectType = 'RT::Queue' AND ACL_2.ObjectId =
8) OR (ACL_2.ObjectType = 'RT::System')) ORDER BY main.Name ASC;

EXPLAIN:
id select_ table  type  possible_   key     key_ ref       rows Extra
   type                 keys                len
------------------------------------------------------------------------------
1 SIMPLE  ACL_2  range  ACL1        ACL1    85   NULL        7  Using where;
                                                                Using index;
                                                                Using
temporary;
                                                                Using filesort
------------------------------------------------------------------------------
1 SIMPLE  main   range  PRIMARY,    PRIMARY 4    NULL      9259 Using where
                        Users3
------------------------------------------------------------------------------
1 SIMPLE  Princi eq_ref PRIMARY     PRIMARY 4    rt3.        1  Using where;
          pals_1                                 main.id        Distinct
------------------------------------------------------------------------------
1 SIMPLE  Cached ref    DisGrouMem  GrouMem 10   rt3.ACL_2.  1 Using where;
          Group         GrouMem                  PrincipalId,   Using index;
          Members_3     MemberId_idx             rt3.main.id    Distinct


2) The same query, but I have put the 'Users main' table to the last position
in the FROM statement. This query is fast (0.0032 sec) from the beginning (as
can be concluded by the small number of rows involved in this).

http://www3.eenet.ee/~laas/explain_select_owners_2.png

SQL query:
EXPLAIN SELECT DISTINCT main.* FROM Principals Principals_1, ACL ACL_2,
CachedGroupMembers CachedGroupMembers_3, Users main WHERE ((ACL_2.PrincipalId
= CachedGroupMembers_3.GroupId)) AND ((ACL_2.PrincipalType = 'Group')) AND
((ACL_2.RightName = 'OwnTicket')) AND ((CachedGroupMembers_3.MemberId =
Principals_1.id)) AND ((Principals_1.Disabled = '0')) AND
((Principals_1.PrincipalType = 'User')) AND ((Principals_1.id != '1')) AND
((main.id = Principals_1.id)) AND ((ACL_2.ObjectType = 'RT::Ticket' AND
ACL_2.ObjectId = 1365) OR (ACL_2.ObjectType = 'RT::Queue' AND ACL_2.ObjectId
= 8) OR (ACL_2.ObjectType = 'RT::System')) ORDER BY main.Name ASC;

EXPLAIN:
id select_ table  type   possible_   key      key_ ref       rows Extra
   type                  keys                 len
-----------------------------------------------------------------------------
1  SIMPLE  ACL_2  range  ACL1        ACL1     85   NULL        7  Using where;
                                                                  Using
-----------------------------------------------------------------------------
1  SIMPLE  Cached ref    DisGrouMem, GrouMem  5    rt3.ACL_2.  4  Using where;
           Group         GrouMem,                  PrincipalId    Using index
           Members_3     MemberId_idx
-----------------------------------------------------------------------------
1  SIMPLE  main   eq_ref PRIMARY,    PRIMARY  4    rt3.CachedG 1
                         Users3
-----------------------------------------------------------------------------
1  SIMPLE  Princ  eq_ref PRIMARY     PRIMARY  4    rt3.main.id 1  Using where;
           ipals_1                                                Distinct


Best regards,
Laas Toom
_______________________________________________
http://lists.bestpractical.com/cgi-bin/mailman/listinfo/rt-users

Community help: http://wiki.bestpractical.com
Commercial support: [EMAIL PROTECTED]


Discover RT's hidden secrets with RT Essentials from O'Reilly Media.
Buy a copy at http://rtbook.bestpractical.com


We're hiring! Come hack Perl for Best Practical: 
http://bestpractical.com/about/jobs.html



--
Best regards, Ruslan.
_______________________________________________
http://lists.bestpractical.com/cgi-bin/mailman/listinfo/rt-users

Community help: http://wiki.bestpractical.com
Commercial support: [EMAIL PROTECTED]


Discover RT's hidden secrets with RT Essentials from O'Reilly Media. Buy a copy at http://rtbook.bestpractical.com


We're hiring! Come hack Perl for Best Practical: 
http://bestpractical.com/about/jobs.html

Reply via email to