我需要select
查询的帮助。
我有一张包含数百万条记录的表格,我使用过:
select * from table where status=1 limit $start,$pagesize
用于分页,因此每页加载25条记录。
我担心的是,当我在表中运行包含数千条记录的查询时,加载时间是可以接受的,但只要我使用批量记录运行查询,加载时间就会增加。
所以我试图找到一种方法,现在我想从表格中只显示2500条最新记录,限制为0到25。
select * from (select * from table
where status=1 order by id limit 0,2500)t
where status=1 order by id limit $start,$pagesize
但加载时间不受影响。
有人可以建议更好的方式吗?
我正在使用索引,并在表上有状态和id字段的索引。
答案 0 :(得分:0)
LIMIT
很难优化in the case that an offset is specified。
由于您有id
上的索引,而且您是ORDER BY id
,您实际上可以通过将LIMIT
中的偏移量替换为{{1}来直接使用索引}}:
WHERE
也就是说,不是使用(页码*页面大小)作为SELECT * FROM table WHERE status=1 AND id > $lastIDRetrieved LIMIT $pageSize
中的偏移量,而是使用您收到的最后一个LIMIT
,从而直接使用{{1上的索引}}
答案 1 :(得分:0)
正如我的另一位朋友所说,是的,它很难优化LIMIT。我建议你实施两件我希望这些能帮助你的事情。
在状态列上添加索引为:
ALTER TABLE
table
ADD INDEX
index_name
(status
);
确保id列是表的Primary Key
,因为PK比其他键更快。
更新1:
使用EXPLAIN,检查正在提取的行数或正确使用索引进行查询?
EXPLAIN select * from table where status=1