淄博新闻网-淄博新闻-淄博最新新闻头条-淄博新闻热线

mysql分页怎么编写哪里有教程案例

淄博文化 2020-01-19 23:13167www.jzlasi.com淄博新闻网

mysql分页怎么编写哪里有教程案例

Mysql分页

通常,客户端通过分页传递两个参数pageNo(页数)和pageSize(每页数)来查询数据库中的数据 )当数据量较小(数百/数千个元组)时,请使用MySQL自己的限制来解决此问题。  

当数据量较小时,仅使用限制进行数据分页不会显着降低性能,但是数据量会达到10,000至10,000。  SQL语句的性能将影响数据的返回。 这时,您需要使用主键或唯一索引进行数据分页。 假设主键或唯一索引是good_id。 接收客户端{pageNo:5,pagesize:10}从表中选择* good_id>(pageNo-1)* pageSize限制pageSize;  –返回具有介于40和50之间的good_id的数据; 当要返回的信息是按顺序或相反的顺序时,将根据数据对上述语句进行重新排序。 按ASC / DESC顺序订购或反向订购默认为订购。  

上面的mysql语句的解释:limit 10000,20的含义是扫描满足条件的10020行,抛出前10000行,返回最后20行,问题就在这里,如果是limit 100000,100  ,您需要扫描100,100行。 在高度并发的应用程序中,每个查询需要扫描10W以上的行,并且性能必须大大降低。 文章还提到限制n性能是可以的,因为仅扫描了n行。  

第二部分:根据Yahoo的几位工程师的说法,扩展了“使用MySQL的有效分页”报告:在本文中提到了一条线索,为翻页提供了一些线索,例如SELECT * FROM message ORDER BY id DESC,分页 按ID降序排列,每页20个条目,当前第10页,当前页面条目ID为最大1020,最小1000,如果我们仅提供上一页,下一页(它不提供到第N页的跳转),然后在处理上一页时,SQL语句可以是:SELECT * FROM message WHERE id> 1020 ORDER BY id ASC LIMIT 20;  //下一页

多少页,每个查询仅扫描20行。  

缺点是只能提供上一页和下一页链接,但是我们的产品经理喜欢“上一页1 2 3 4 5 6 7 8 9下一页”链接方法,该怎么办? 这个怎么样? 如果LIMIT m,n是不可避免的,为了优化效率,我们只能使m尽可能小。 我们扩展了以前的线索方法,即SELECT * FROM消息ORDER BY ID DESC,按ID降序分页,每页20条,当前是第10页。 当前页的最大条目ID为2519,最小条目ID为2500。

 LIMIT子句可用于指定SELECT语句返回的记录数。 请注意以下几点:第一个参数指定返回的第一条记录行的偏移量; 第二个参数指定返回的记录行的最大数目; 如果仅给出一个参数:这意味着返回最大记录行数; 第二个参数为-1,以检索从偏移量到记录集末尾的所有记录行; 初始记录行的偏移量为0(而不是1)。  

当然,您也可以使用in方法进行查询。 此方法通常用于在关联多个表时进行查询,并使用其他表的ID集进行查询。 该in查询方法应注意:一些mysql版本不支持in子句中的使用限制。  

关于数据表的ID:通常,在数据库中创建表时,每个表都被强制添加一个ID增量字段,这对于我们查询数据更加方便。 如果数据量很大(例如订单),通常建议划分数据库和表。 目前,不建议将该ID作为唯一标识符,而应使用分布式高并发唯一ID生成器来生成,并使用数据表中的另一个字段来存储该唯一标识符。 首先使用范围查询来定位ID(或索引),然后使用索引来定位数据,即select id,然后选择*; 这样查询速度将快几倍。  

许多应用程序通常仅显示最新或最受欢迎的记录,但是为了仍然访问旧记录,需要页面导航栏。 但是,如何更好地通过MySQL实现分页一直是一个头疼的问题。 尽管没有可用的解决方案,但了解数据库的底部或多或少有助于优化分页查询。  

当有200万行记录时,上述查询需要0.22秒。 通过EXPLAIN查看SQL执行计划,可以发现SQL检索了100015行,但最后只需要15行。 较大的分页偏移量会增加使用的数据,MySQL会加载大量最终将不会使用到内存中的数据。 即使我们假设大多数网站用户仅访问数据的前几页,对少量页面偏移量的少量请求也会损害整个系统。  Facebook意识到了这一点,但是与其优化数据库以使其每秒能够处理更多请求,它着重于减少请求响应时间的差异。 但是,将InnoDB用作存储引擎时,上述SQL需要9.28秒的时间。 一个不正确的优化是使用SQL_CALC_FOUND_ROWS,当分页查询中符合条件的记录数时可以预先准备SQL_CALC_FOUND_ROWS,然后简单地执行选择FOUND_ROWS; 获取记录总数。 但是在大多数情况下,短查询语句并不意味着性能会有所提高。 不幸的是,这种分页查询方法已在许多主流框架中使用。 让我们看一下该语句的查询性能。  

如果使用的引擎是MyISAM,则可以直接执行COUNT(*)以获取行数。 同样,行数也存储在堆表的表的元信息中。 但是,如果引擎是InnoDB,情况将更加复杂,因为InnoDB不会在表中保存特定的行数。 我们可以缓存行数,然后通过守护进程或在某些用户操作导致缓存无效时定期更新它。

淄博新闻网-淄博新闻-淄博最新新闻头条-淄博新闻热线 Copyright © 2017-2019 http://www.jzlasi.com 淄博新闻 版权所有 

网站部分内容来自网络,如有侵权请联系我们,立即删除!