草庐IT

PHP MySQL 分页很慢

coder 2023-10-06 原文

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

考虑到这一点,这是我的查询:

SELECT * FROM posts WHERE long>-118.13902802886 AND long<-118.08130797114 AND lat>33.79987197114 AND lat<33.85759202886 ORDER BY id ASC LIMIT 0, 25

显示第 0 - 15 行(总共 16 行,查询耗时 1.5655 秒)[id: 32846 - 540342]

查询只给我带来了 1 页,但因为它必须搜索所有 230k 记录,所以仍然需要 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/

有关PHP MySQL 分页很慢的更多相关文章

  1. ruby - 每个页面上的 Jekyll 分页 - 2

    据我们所知,Jekyll默认分页仅支持index.html,我想创建blog.html并在那里包含分页。有什么解决办法吗? 最佳答案 如果您创建一个名为/blog的目录并在其中放置一个index.html文件,那么您可以向_config.yml表示paginate_path:"blog/page:num"。不是使用根文件夹中的默认index.html作为分页器模板,而是使用/blog/index.html。分页器将根据需要生成类似/blog/page2/和/blog/page3/的页面。这将使您到达yourwebsite.com/b

  2. ruby-on-rails - Rails 3 Cli 执行命令真的很慢吗? - 2

    有人知道为什么我的rails3.0.7cli这么慢吗?当我运行railss或railsg时,他大约需要5秒才能真正执行命令...有什么建议吗?谢谢 最佳答案 更新:我正在将我的建议从rrails切换到rails-sh,因为前者支持REPL,而rrails不是用例。此外,当与ruby​​环境结合使用时,修补似乎确实可以提高性能变量,现在反射(reflect)在答案中。一个可能的原因可能是这个performancebuginruby每当在ruby​​代码中使用“require”时,它就会调用一些代码(更多详细信息here)。在使用Rai

  3. ruby-on-rails - Ruby 的 range step 方法导致执行速度很慢? - 2

    我有这段代码:date_counter=Time.mktime(2011,01,01,00,00,00,"+05:00")@weeks=Array.new(date_counter..Time.now).step(1.week)do|week|logger.debug"WEEK:"+week.inspect@weeks从技术上讲,代码有效,输出:SatJan0100:00:00-05002011SatJan0800:00:00-05002011SatJan1500:00:00-05002011etc.但是执行时间完全是垃圾!每周计算大约需要四秒钟。我在这段代码中是否遗漏了一些奇怪的低效

  4. ruby - 使用 Her、Faraday 在 API 中进行 Rails 分页 - 2

    我一整天都在想办法解决这个问题,这让我发疯了。我有两个Rails应用程序,ServerApp和ClientApp。ClientApp使用Hergem通过API从ServerApp获取数据。一切都很好,直到我需要分页信息。这是我用来获取订单的方法(使用kamainari进行分页,使用ransack进行搜索):#ServerAppdefsearch@search=Order.includes(:documents,:client).order('iddesc').search(params[:q])@orders=@search.result(distinct:true).page(par

  5. ruby - ruby 插件会使启动 vim 很慢吗? - 2

    最近,当我运行vim来编辑ruby​​文件或rails项目时,它需要很长时间才能启动。但是在纯文本文件上调用时它启动速度很快。有什么方法可以找出哪些ruby​​vim插件最能延长启动时间? 最佳答案 如果您使用的是7.2.286或更新版本,您可以运行vim--startuptimevim.outfoo.rb记录启动过程的各个部分需要多长时间。 关于ruby-ruby插件会使启动vim很慢吗?,我们在StackOverflow上找到一个类似的问题: https:

  6. Ruby SSH 禁用分页 - 2

    有什么方法可以禁用或设置ruby​​Net-SSH连接的页面长度,这样我们就不必更改远程设备上的设置了吗?在Cisco路由器中,我们将使用参数“terminallength0”来完成此操作,但在其他服务器上,我们不能使用任何类似的命令。这可以通过Net-SSHlib设置吗? 最佳答案 假设远程端有一个shell,那么终端高度在LINES环境变量中设置。您可以尝试这样设置:Net::SSH.start('hostname','user')do|ssh|ssh.exec!('LINES=50your-command-here')end如

  7. ruby - 不需要的表单参数被附加到分页链接 - 2

    我有一个页面,用于通过使用提供的表格提交数据来搜索列表。表单参数通过ajax(post请求)提交,在搜索表中创建一条新记录,然后通过show显示列表(动态地,在提交表单的同一页面上)此记录的操作。结果有kaminari提供的分页链接,如下所示:{:controller=>'searches',#Ihavetospecifytheidbecausemysearchesarestoredinthedatabase:action=>'show',:id=>search.id},:remote=>true%>请注意,分页链接是动态包含在页面中的。因此,当我进行新搜索并获得新列表时,服务器会重新

  8. Elasticsearch7.8.0版本入门—— 分页查询文档(高级查询) - 2

    目录一、初始化文档数据二、分页查询文档2.1、概述2.2、示例一、初始化文档数据在Postman中,向ES服务器发POST请求:http://localhost:9200/user/_doc/1,请求体内容为:{"name":"zhangsan","age":20,"sex":"男"}在Postman中,向ES服务器发POST请求:http://localhost:9200/user/_doc/2,请求体内容为:{"name":"zhangsan1","age":21,"sex":"男"}在Postman中,向ES服务器发POST请求:http://localhost:9200/user/_d

  9. ruby-on-rails - 在 Kaminari 中对多个模型进行分页 - 2

    我正在创建一个搜索页面,该页面将对用户、帖子和评论进行应用程序范围内的搜索。我目前有:#POST/searchdefindexquery=params[:query]@users=User.search(query).page(params[:page])@posts=Post.search(query).page(params[:page])@comments=Comment.search(query).page(params[:page])respond_todo|format|format.htmlendend不过,我真的想把所有结果混合在一起然后分页。像这样进行分页搜索有哪些策

  10. ruby-on-rails - Rails 开发服务器很慢,需要很长时间才能加载一个简单的页面 - 2

    关于Rails在开发模式下运行缓慢的类似帖子也有,但这些帖子中的解决方案都没有对我产生任何影响。我试过安装可以提高性能的gem并修改配置文件,但都没有成功。我刚开始使用Rails,所以我正在运行“Rails入门”指南中的启动应用程序,这是一个小博客。我已经按照推荐安装了Ruby1.9.3和Rails3.2.13。我在OS/X10.7.5上运行。当加载教程应用的起始页时,实际上只有1行文本和1个链接,需要20-40秒。对任何页面的每个后续请求都需要20-40秒。然而,当我查看服务器日志时,Rails所做的任何事情似乎都不会花费很长时间。日志中的事件之间的时间一直在占用。作为Rails的初

随机推荐