Home > Backend Development > PHP Tutorial > php分页如何提高效率的问题

php分页如何提高效率的问题

WBOY
Release: 2016-06-06 20:50:52
Original
1239 people have browsed it

现在写分页时要先算出总的数据条数,然后根据每页多少个,算出一共多少页。

也就是写语句的时候如下:

$req = date > 1200000000
先SELECT count(*) FROM test WHERE {$req}
然后根据这个总条数和每页显示的条数得出$limit
再SELECT * FROM test WHERE {$req} LIMIT {$limit}

感觉这样的执行效率不高,请问能不能只SELECT一次呢?

回复内容:

现在写分页时要先算出总的数据条数,然后根据每页多少个,算出一共多少页。

也就是写语句的时候如下:

$req = date > 1200000000
先SELECT count(*) FROM test WHERE {$req}
然后根据这个总条数和每页显示的条数得出$limit
再SELECT * FROM test WHERE {$req} LIMIT {$limit}

感觉这样的执行效率不高,请问能不能只SELECT一次呢?

担心性能的话,可以摒弃"总页数"的话,请参考
yahoo 的 Efficient Pagination Using MySQL

使用SQL_CALC_FOUND_ROWS,请先阅读
To SQL_CALC_FOUND_ROWS or not to SQL_...

Mysql 在做分页带Limit查询的时候,越往后面,效率越低,我说下我自己的做法,一般主键ID都为自增的,且带where条件数据不可能完全都是所要得到的数据。 举个例子 有一张表 we_user_score 存积分的表
uid(_pk) username(用户名) score(积分)

假设有100条数据 其中积分分布为10-100这个区间。这个时候,想要获取score>30的数据 每页5条

select uid,username,score from we_user_score where score>30 limit 0,5;
Copy after login

但是在做第二页查询的时候 sql就可以这么写

select uid,username,score from we_user_score where uid>=5 and score>30 limit 5,5;
Copy after login

依次类推,这样在大数据量的情况下,速度会提升的比较明显,这应该属于一个小细节吧,呵呵

其实这种大数据中效率会快很多的。很不错一个分享。

mysql对select count(*)是有优化的,所以实际的查询消耗很少,LZ觉得执行效率不好,那最好去看下mysql的explain数据吧,一切以数据为准。

你可以试试 SQL_CALC_FOUND_ROWS,虽然说也是两次查询,但MySQL本身不需要再执行一次索引查找了。

用法

SELECT SQL_CALC_FOUND_ROWS * FROM test WHERE {$req} LIMIT {$limit}
Copy after login

在完成查询以后立即执行

SELECT FOUND_ROWS()
Copy after login

有人说并发的情况下,结果可能会错乱,详见这里http://us3.php.net/manual/en/function...

PS: 你的查询条件上有索引的话,不用过于担心性能问题做预先优化,等到性能真的有问题了再说。

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template