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的字段都应当建立索引,基于索引的排序总是会很快。
通过优化后的limit语句,在大数据表的分页中我们可以取得更好的性能。
貌似关于大数据分页也是一个不错的考验水平的题目。
----------------------------------------------------------------------------粉葛----------------------------------------------------------------------------
在开发过程我们经常需要统计数据库表中的记录数,比如分页(分页不一定非要统计总记录数),我们常常会用下面的两种行式来获取总记录数:
select count(*) from news;
select count(id) from news;
这两种count写法,到底哪一种更快呢?很长一段时间我都认为count(id)会比count(*)要快,但事实上count(*)要比count(id)要快。