I have a Web application that allows users to search for text in a
potentially complicated form, and then return results. Leaving aside
the issue of the speed of FULLTEXT searching, which I'm discussing
in a separate thread, I'm having a problem with an initial COUNT
query.
When the user enters their search, I first do a COUNT so I can get
the total result size and set up the pager for the usual next/previous
skipping through the results. When the result set is large, this initial
COUNT can be extremely slow; this, for example, is from a question about
words in the letter "M" within the last six months:
mysql> SELECT(cg.cw) AS cwcount FROM cg,q,cit,sref
-> WHERE cg.q_id = q.id AND q.cit_id = cit.id AND cit.sref_id = sref.id
-> AND cg.cw LIKE 'm%' AND sref.cd > DATE_SUB(CURDATE(), INTERVAL 6 MONTH);
+---------+
| cwcount |
+---------+
| 4666 |
+---------+
1 row in set (1 min 11.26 sec)
Everything is indexed here; the EXPLAIN shows:
*************************** 1. row ***************************
table: cg
type: range
possible_keys: q_id,cw
key: cw
key_len: 101
ref: NULL
rows: 147780
Extra: Using where
*************************** 2. row ***************************
table: q
type: eq_ref
possible_keys: PRIMARY,cit_id
key: PRIMARY
key_len: 4
ref: cg.q_id
rows: 1
Extra:
*************************** 3. row ***************************
table: cit
type: eq_ref
possible_keys: PRIMARY,sref_id
key: PRIMARY
key_len: 4
ref: q.cit_id
rows: 1
Extra:
*************************** 4. row ***************************
table: sref
type: eq_ref
possible_keys: PRIMARY,cd
key: PRIMARY
key_len: 4
ref: cit.sref_id
rows: 1
Extra: Using where
4 rows in set (0.00 sec)
This is on a 1.4GHz PIII server running FreeBSD 4.7 with 1G of RAM.
Needless to say, over a minute for a single user's query is
unacceptably slow; generally after the COUNT, when I'm issuing
LIMITed SELECT queries, things get much better.
Is there any way to improve on this?
Thanks.
Jesse Sheidlower
---------------------------------------------------------------------
Before posting, please check:
http://www.mysql.com/manual.php (the manual)
http://lists.mysql.com/ (the list archive)
To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php