我的 table
Field Type Null Key Default Extra
id int(11) NO PRI NULL auto_increment
userid int(11) NO MUL NULL
title varchar(50) YES NULL
hosting varchar(10) YES NULL
zipcode varchar(5) YES NULL
lat varchar(20) YES NULL
long varchar(20) YES NULL
msg varchar(1000)YES MUL NULL
time datetime NO NULL
那是 table 。我已经模拟了500k的数据行,并随机删除了270k的行,仅剩下230k,并自动增加了500k。
这是我的索引
Keyname Type Unique Packed Field Cardinality Collation Null
PRIMARY BTREE Yes No id 232377 A
info BTREE No No userid 2003 A
lat 25819 A YES
long 25819 A YES
title 25819 A YES
time 25819 A
考虑到这一点,这是我的查询:
显示第0-15行(共16行,查询耗时1.5655秒)[id:32846-540342]
该查询仅给我带来了一页,但由于它必须搜索所有23万条记录,因此仍然需要1.5秒。
这是解释的查询:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE posts index NULL PRIMARY 4 NULL 25 Using where
因此,即使我使用where子句仅返回16个结果,我仍然会得到缓慢的查询。
现在例如,如果我进行更广泛的搜索:
SELECT * FROM `posts` WHERE `long`>-118.2544681443 AND `long`<-117.9658678557 AND `lat`>33.6844318557 AND `lat`<33.9730321443 ORDER BY id ASC LIMIT 0, 25
显示第0-24行(共25行,查询耗时0.0849秒)[id:691-29818]
检索20页中的第一页并找到483个时,它的速度要快得多,但我限制为25个。
但是如果我要最后一页
SELECT * FROM `posts` WHERE `long`>-118.2544681443 AND `long`<-117.9658678557 AND `lat`>33.6844318557 AND `lat`<33.9730321443 ORDER BY id ASC LIMIT 475, 25
显示第0-7行(共8行,查询耗时1.5874秒)[id:553198-559593]
我得到一个缓慢的查询。
我的问题是如何实现良好的分页?当该网站上线时,我希望发布时该帖子将被删除,并每天由数百人发布。
帖子应按ID或时间戳记排序,并且ID不连续,因为某些记录将被删除。
我想要一个标准的分页
1 2 3 4 5 6 7 8 ... [Last Page]
最佳答案
使用WHERE
子句从出现在较早页面上的结果记录中进行过滤:则无需指定偏移量,只需指定行数即可。例如,跟踪最后看到的ID或时间戳,并仅对ID或时间戳大于此记录的记录进行过滤。
关于PHP MySQL分页缓慢,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12156807/