|
转载自重庆PHP:http://www.php-chongqing.com/index.php/article/52
在写分页的时候,我们通常都会用limit来限制返回结果集的行数,比如:
SELECT title, summary, created FROM news ORDER BY created DESC LIMIT 20, 10;
我们通过limit查询,取出新闻表中的第20~29之间的记录,假如我们的新闻数据非常多,我们要取出10000~10009之间的数据,那么我们写成:
SELECT id, title, summary, created FROM news ORDER BY created DESC LIMIT 10000, 10;
Mysql执行这条SQL语句,会产生10010行数据,然后丢弃前10000行数据,将最后的10行数据返回给你,执行这条SQL语句的代价非常的高,所以,如果你表中的数据非常多,而你又需要分页,你的SQL语句最好写成下面这样:
SELECT id, title, summary, created FROM news INNER JOIN ( SELECT id FROM news ORDER BY created DESC LIMIT 10000, 10 ) AS a USING(id);
首先,你要为created建索引,所有order by的字段都应当建立索引,基于索引的排序总是会很快。
执行改写后的SQL语句,我们从索引上检索数据,取出所需要的行,并且只取出id列的数据,因为id也是索引,然后我们再连接表,取出所需要的其它列的数据。
通过优化后的limit语句,在大数据表的分页中我们可以取得更好的性能。 |
|