我正在使用 jquery 和 DataTables 插件构建一个 php 站点。我的页面布局与分页工作所需的一样,但在处理大型数据集时,我注意到服务器正在提取所有返回的行,而不是每个“页面”中规定的 10 行(可能更多)限制。
是否可以限制查询的结果,但在内存中保留这些结果的 ID 号,以便在点击第 2 页(或更改结果号)时只寻找新数据?
这样做是否有意义?
我只是不想查询一个返回 2000 行的数据库,然后有一个“前端插件”使它看起来像其他结果从一开始就真实地在页面上时被隐藏。
我正在使用 jquery 和 DataTables 插件构建一个 php 站点。我的页面布局与分页工作所需的一样,但在处理大型数据集时,我注意到服务器正在提取所有返回的行,而不是每个“页面”中规定的 10 行(可能更多)限制。
是否可以限制查询的结果,但在内存中保留这些结果的 ID 号,以便在点击第 2 页(或更改结果号)时只寻找新数据?
这样做是否有意义?
我只是不想查询一个返回 2000 行的数据库,然后有一个“前端插件”使它看起来像其他结果从一开始就真实地在页面上时被隐藏。
SQL 中的 LIMIT 子句有两部分——限制和偏移。
要获取前 10 行:
SELECT ... LIMIT 0,10
要获取接下来的 10 行:
SELECT ... LIMIT 10,10
要获取接下来的 10 行:
SELECT ... LIMIT 20,10
只要您每次都订购相同的结果集,您绝对不必(也不想)首先要求数据库向您发送所有 2000 行。
要同时显示分页,您仍然需要知道有多少总行与您的查询匹配。有两种处理方法——
1) 使用单独的查询询问行数
SELECT COUNT(*) FROM table WHERE ...
2) 在查询中使用 SQL_CALC_FOUND_ROWS 提示,这将告诉 MySQL 在仅返回您要求的 10 行之前计算与查询匹配的行数。然后,您发出SELECT FOUND_ROWS()
查询以获取该结果。
SELECT SQL_CALC_FOUND_ROWS column1, column2 ... LIMIT 0,10
2 更可取,因为它不会为每个页面加载添加额外的查询。