I have standard search functionality on my site where a user can see NN items per
screen of a much longer list of search results. I've found that MySQL returns small
result sets out of a list of hits faster when queried in 2 parts than queried once. Am
I doing something wrong ?
I have a fairly standard join query on a few tables with about 20,000 rows.
SELECT g.poster_id, g.poster_name, p.file_name,
p.file_size, p.post_subject, p.post_id,
DATE_FORMAT(p.post_date,'%b-%d-%y') AS date, p.file_extension
FROM users_to_files u, posts p, posters g
WHERE p.poster_id = g.poster_id AND
p.post_id = u.post_id AND u.user_id = $folder_owner_id AND u.folder_id =
$src_folder
ORDER_BY g.poster_name, p.post_subject
LIMIT 0,10
When I do a SELECT on that join to get just 10 rows using an ORDER BY and a LIMIT 0,10
it takes about 2 seconds per set of 10.
As an experiment I broke up this query into 2 parts & it only takes about 0.2 seconds
or less per set of 10.
#1 The first query gets just the post_id's that I care about.
SELECT p.post_id
FROM posts p, posters g $POSTS_TO_GROUPS
WHERE p.poster_id = g.poster_id
AND p.file_size > 0
ORDER BY g.poster_name, p.post_subject
#2 Then I do the joined query on all the columns on just the small list of post_ids to
act as a LIMIT.
SELECT g.poster_id, g.poster_name, p.file_name,
p.file_size, p.post_subject
DATE_FORMAT(p.post_date,'%b-%d-%y') AS date, p.file_extension
FROM posts p, posters g
WHERE p.post_id IN ($post_ids_in) AND p.poster_id = g.poster_id
ORDER BY g.poster_name, p.post_subject
Shouldn't MySQL be as fast or faster to do this join in the 1 query than the 2 queries
?
Does the MySQL optimizer not recognize that only the few rows specified by the LIMIT
actually need to be retrieved ?
If so is there a way to help MySQL optimize the join ?
Displaying a page full portion at a time of a long list of results is a very common
web thing for MySQL to do so hopefully I'm just doing something wrong.
thanks,
- Sam.
---------------------------------
Do You Yahoo!?
Make international calls for as low as $.04/minute with Yahoo! Messenger
http://phonecard.yahoo.com/