我的 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/

10-11 03:10
查看更多