← Back to team overview

maria-developers team mailing list archive

Re: LIMIT optimisations


On Wed, Mar 10, 2010 at 4:01 PM, Jocelyn Fournier <joce@xxxxxxxxxxxxx> wrote:
> Hi !
> On a bulletin board context, that's quite simple :
> Let's say we want to display a forum thread containing a lot of posts.
> To simplify, I have the following table 'posts' which contains :
> - id_thread
> - id_post
> - content
> - id_author
> If I want to display a paginated posts list of a given topic, with 30 posts
> per page, I have to do :
> SELECT content, author_name FROM posts LEFT JOIN author USING (id_author)
> ....... WHERE id_thread=.... ORDER BY id_post ASC LIMIT x,30
> I have a PK on (id_thread, id_post).
> If I have a lot of posts in this thread, I could have easily a big LIMIT to
> get the last pages of the thread, which are the more often read (and the
> query will be triggered quite often especially if google like my bulletin
> board :)).
> The current behaviour of MyISAM seems to be to always scan all the rows;
> than means if I have a LIMIT 12000,40, the first useless 12000 rows will be
> scanned, and this is especially bad if "content" is a TEXT field (no static
> lengths row here).

This is the behavior for all storage engines. I don't think you are
going to get the optimization in MySQL that I think you are asking
for. I have written about the performance problems of pagination and a
workaround in http://www.facebook.com/note.php?note_id=206034210932.

Mark Callaghan

Follow ups