[rt-devel] Slow queries, part 2, custom fields
Scott Muller
smuller at netcommplete.com.au
Tue Oct 7 02:35:19 EDT 2003
Ian
See http://www.mysql.com/newsletter/2003-01/a0000000108.html
http://www.mysql.com/doc/en/Query_Cache_How.html
Basically the Mysql book says that the queries must be :-
"exactly the same (byte for byte)"
so "select * from table" and "SELECT * FROM TABLE" are different.
Scott.
-----Original Message-----
From: rt-devel-admin at lists.fsck.com [mailto:rt-devel-admin at lists.fsck.com]
On Behalf Of Iain Price
Sent: Friday, 3 October 2003 8:56 PM
To: Phil Homewood
Cc: rt-devel at lists.fsck.com
Subject: Re: [rt-devel] Slow queries, part 2, custom fields
Phil Homewood wrote:
Iain Price wrote:
OK all my tables are now innodb format... The query now takes 3 min 12
seconds (previously was between 4m30 and 5min). This will double up to
6 and a half minutes through the RT3 search cos of the count() query
Actually, I don't think it should double, if you've enabled mysql's
query_cache. Though I'm not 100% sure the optimiser will reuse the
cached result if there's a count() there....
At any rate:- that's still a very slow query. mysql's "explain"
might give some tips on why it's being so slow.
Yeah been chatting to someone else off-list about databases... Now i've got
proper query caching in place, and a 'large' mysql memory config thing, the
search still takes 3min 12 but at least the repetition of the search should
be near instant...... but yeah these approaches aren't solving the problem
of a badly analysed query.
Also, sadly regarding the 'doubling' of the search
[root at xxxxxxxxxx root]# time mysql rt3 -e "SELECT count(DISTINCT main.id)
FROM ( Tickets main LEFT JOIN TicketCustomFieldValues as
TicketCustomFieldValues_1 ON ((TicketCustomFieldValues_1.CustomField =
'1')) AND ( main.id = TicketCustomFieldValues_1.Ticket)) WHERE
((main.EffectiveId = main.id)) AND ((main.Type ='ticket')) AND ( ( (
(TicketCustomFieldValues_1.Content LIKE '%%xxxxxxxxxx%%') ) ) )" >/dev/null
real 3m4.694s
user 0m0.004s
sys 0m0.002s
[root at xxxxxxxxxx root]# time mysql rt3 -e "SELECT DISTINCT main.* FROM (
Tickets main LEFT JOIN TicketCustomFieldValues as TicketCustomFieldValues_1
ON ((TicketCustomFieldValues_1.CustomField = '1')) AND ( main.id =
TicketCustomFieldValues_1.Ticket)) WHERE ((main.EffectiveId = main.id)) AND
((main.Type = 'ticket')) AND ( ( ( (TicketCustomFieldValues_1.Content LIKE
'%%xxxxxxxxxx%%') ) ) ) ORDER BY main.id ASC LIMIT 50" >/dev/null
real 3m12.915s
user 0m0.006s
sys 0m0.002s
(lol at it taking me a few seconds to realise why user/sys values are
negligable)
I.e when RT executes the query twice, once for the 'xx results', once to get
the results, mysql evaluates each one from scratch, even thought the where
clause on the statements is the same. I dont know if its the aggregation
count() function or the sort/limit that causes the results to be unusable,
or even the different fields searched for (one counts id and the other
returns *) - this is unfortunate - it would be nice if mysql would cache the
pre-aggregation result set - or whever causes it this issue, but this isn't
a RDBMS analysis really - not the theory of writing one anyway :)
And to prove it all works, when i run it again immediately after...
[root at xxxxxxxxxx root]# time mysql rt3 -e "SELECT count(DISTINCT main.id)
FROM ( Tickets main LEFT JOIN TicketCustomFieldValues as
TicketCustomFieldValues_1 ON ((TicketCustomFieldValues_1.CustomField =
'1')) AND ( main.id = TicketCustomFieldValues_1.Ticket)) WHERE
((main.EffectiveId = main.id)) AND ((main.Type ='ticket')) AND ( ( (
(TicketCustomFieldValues_1.Content LIKE '%%xxxxxxxxxx%%') ) ) )" >/dev/null
real 0m0.007s
user 0m0.004s
sys 0m0.004s
[root at xxxxxxxxxx root]# time mysql rt3 -e "SELECT DISTINCT main.* FROM (
Tickets main LEFT JOIN TicketCustomFieldValues as TicketCustomFieldValues_1
ON ((TicketCustomFieldValues_1.CustomField = '1')) AND ( main.id =
TicketCustomFieldValues_1.Ticket)) WHERE ((main.EffectiveId = main.id)) AND
((main.Type = 'ticket')) AND ( ( ( (TicketCustomFieldValues_1.Content LIKE
'%%xxxxxxxxxx%%') ) ) ) ORDER BY main.id ASC LIMIT 50" >/dev/null
real 0m0.007s
user 0m0.000s
sys 0m0.004s
Once again tests on ms-sql with these queries produces near instant results.
As for explains...
+---------------------------+-------+---------------+-------+---------+-----
-+------+----------------------------------------------+
| table | type | possible_keys | key | key_len | ref
| rows | Extra |
+---------------------------+-------+---------------+-------+---------+-----
-+------+----------------------------------------------+
| main | range | test | test | 17 | NULL
| 2286 | Using where; Using temporary; Using filesort |
| TicketCustomFieldValues_1 | index | NULL | test2 | 268 | NULL
| 8651 | Using where; Using index; Distinct |
+---------------------------+-------+---------------+-------+---------+-----
-+------+----------------------------------------------+
2 rows in set (0.00 sec)
oh thats with my testing index in there which made little (30 seconds)
difference to the search...
+---------------------------+------+---------------+------+---------+------+
------+----------------------------------------------+
| table | type | possible_keys | key | key_len | ref |
rows | Extra |
+---------------------------+------+---------------+------+---------+------+
------+----------------------------------------------+
| main | ALL | NULL | NULL | NULL | NULL |
4663 | Using where; Using temporary; Using filesort |
| TicketCustomFieldValues_1 | ALL | NULL | NULL | NULL | NULL |
8447 | Using where; Distinct |
+---------------------------+------+---------------+------+---------+------+
------+----------------------------------------------+
2 rows in set (0.04 sec)
without said indexes.... (wow theres less rows without the index :P what
does that mean lol) i am half hartedly hacking indexes around especially
after my last success with indexes but i still dont think this will get it
down to a reasonable search time (3-5 seconds) :|
As ever any suggestions gratefully received :)
Thanks,
Iain
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://pallas.eruditorum.org/pipermail/rt-devel/attachments/20031007/80d1dc78/attachment.htm
More information about the Rt-devel
mailing list