在我最近的一个基于PHP(CodeIgniter)的项目中,MySQL表包含近30000条记录(并且会增加更多)。当我将这些记录显示为列表时,会降低性能(MySQL会在很短的时间内检索所有这些记录,但运行PHP循环大约30000次是不可行的)。所以我的计划是一次加载100条记录并创建一个分页,以便用户可以选择一个页码来加载指定数量的记录。
我可以使用以下查询轻松加载前100条记录:
SELECT * FROM <table_name> ORDER BY id ASC LIMIT 100
但问题是:当我选择page = 2,page = 3,....,page = n时。如何编写一个MySQL查询,它将加载第二百条100条记录(页面= 2),第三条100条记录(页面= 3),......第100条记录(页面= n)?
NB:请参考101号码记录可能没有ID 101,类似的201号码记录可能没有201的ID,所以请不要建议我查询取决于主键
任何人都可以帮我找出正确的查询吗? - 谢谢
答案 0 :(得分:3)
第一百个
sails.models.user
下一百
SELECT * FROM <table_name> ORDER BY id ASC LIMIT 0, 100
你非常注意在
中下订单 解释限制声明:
SELECT * FROM <table_name> ORDER BY id ASC LIMIT 100, 100
语句不是LIMIT
子句。它不是由WHERE
选择,也不是由任何标准选择,(id
子句就是这样)而是where
子句只是确保你返回{{1}的一部分结果是“一切”的子集。因此,为什么每次提到一个limit
很重要,这样每个后续调用都会按顺序为您提供正确的数据块,并且您可以通过它们“下一步”,“下一步”,“下一步”
EG:对于无序表block
:
order by
选择返回如下:
this_table
和
+-------+-------------+
| id | value |
+-------+-------------+
| 1 | bob |
| 12 | fish |
| 112 | pink |
| 2 | cat |
| 8 | dog |
| 56 | blue |
| 88 | grey |
| 87 | red |
+-------+-------------+
注意缺少第9行和第10行这是故意的,并显示MySQL按预期工作
顺便说一下,您还应该考虑在SELECT * FROM <this_table> ORDER BY id ASC LIMIT 0,5
+-------+-------------+
| id | value |
+-------+-------------+
| 1 | bob |
| 2 | cat |
| 8 | dog |
| 12 | fish |
| 56 | blue |
+-------+-------------+
上添加一个索引,这将大大提高这些选择的速度
SELECT * FROM <this_table> ORDER BY id ASC LIMIT 5,5
+-------+-------------+
| id | value |
+-------+-------------+
| 87 | red |
| 88 | grey |
| 112 | pink |
+-------+-------------+
答案 1 :(得分:2)
试试这个
SELECT * FROM <table_name> ORDER BY id ASC LIMIT <p * 100>, 100
所以你必须
SELECT * FROM <table_name> ORDER BY id ASC LIMIT 0, 100
SELECT * FROM <table_name> ORDER BY id ASC LIMIT 100, 100
这项工作如果第一页= 0,否则,你需要(p-1)* 100