有效使用分页和MySQL查询

时间:2012-06-01 07:02:55

标签: mysql

目前我运行两个MySQL查询来处理我的分页...

查询1选择表中的所有行,这样我就知道需要列出多少页。

查询2选择当前页面的行(例如:第1页的行0到19(LIMIT 0,19),第2页的第20-39行等)。

似乎浪费了两个重复的查询,唯一的区别是LIMIT部分。

最好的办法是什么?

我应该在运行一个查询后使用PHP来过滤结果吗?

编辑:我应该运行一个查询并使用像array_slice()之类的内容来列出我想要的行吗?

2 个答案:

答案 0 :(得分:2)

最好的&最快的方法是使用2个MYSQL查询进行分页(正如您已经使用的那样),为避免过度头痛,您必须通过仅选择一个足够的列(例如主键)来简化用于查找总行数的查询。 SELECT * FROM sampletable WHERE condition1>1 AND condition2>2 对于分页这样的查询,您可以使用这两个查询 SELECT * FROM sampletable WHERE condition1>1 AND condition2>2 LIMIT 0,20 SELECT id FROM sampletable WHERE condition1>1 AND condition2>2

答案 1 :(得分:0)

使用FOUND_ROWS()

SELECT语句可以包含LIMIT子句,以限制服务器返回到客户端的行数。在某些情况下,需要知道语句在没有LIMIT的情况下返回了多少行,但是没有再次运行语句。要获取此行计数,请在SELECT语句中包含SQL_CALC_FOUND_ROWS选项,然后再调用FOUND_ROWS():

mysql> SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name
    -> WHERE id > 100 LIMIT 10;
mysql> SELECT FOUND_ROWS();

第二个SELECT返回一个数字,表示如果没有LIMIT子句,第一个SELECT将返回多少行。

请注意,这会给数据库带来额外的压力,因为它必须每次都找出完整结果集的大小。仅在您需要时使用SQL_CALC_FOUND_ROWS