mysql分页查询如何优化_mysql分页查询优化

mysql分页查询如何优化_mysql分页查询优化测试实验1.直接用limitstart,count分页语句,也是我程序中用的方法:select*fromproductlimitstart,count当起始页较小时,查询没有性能问题,我们分别看下从10,100,1000,10000开始分页的执行时间(每页取20条),如下:select*fromproductlimit10,200.016秒sele…

大家好,又见面了,我是你们的朋友全栈君。

测试实验

1.   直接用limit start, count分页语句, 也是我程序中用的方法:

select * from product limit start, count

当起始页较小时,查询没有性能问题,我们分别看下从10, 100, 1000, 10000开始分页的执行时间(每页取20条), 如下:

select * from product limit 10, 20 0.016秒select * from product limit 100, 20 0.016秒select * from product limit 1000, 20 0.047秒select * from product limit 10000, 20 0.094秒

我们已经看出随着起始记录的增加,时间也随着增大, 这说明分页语句limit跟起始页码是有很大关系的,那么我们把起始记录改为40w看下(也就是记录的一般左右)

select * from product limit 400000, 20 3.229秒

再看我们取最后一页记录的时间

select * from product limit 866613, 20 37.44秒

难怪搜索引擎抓取我们页面的时候经常会报超时,像这种分页最大的页码页显然这种时间是无法忍受的。

从中我们也能总结出两件事情:

1)limit语句的查询时间与起始记录的位置成正比

2)mysql的limit语句是很方便,但是对记录很多的表并不适合直接使用。

2.   对limit分页问题的性能优化方法

利用表的覆盖索引来加速分页查询

我们都知道,利用了索引查询的语句中如果只包含了那个索引列(覆盖索引),那么这种情况会查询很快。

因为利用索引查找有优化算法,且数据就在查询索引上面,不用再去找相关的数据地址了,这样节省了很多时间。另外Mysql中也有相关的索引缓存,在并发高的时候利用缓存就效果更好了。

在我们的例子中,我们知道id字段是主键,自然就包含了默认的主键索引。现在让我们看看利用覆盖索引的查询效果如何:

这次我们之间查询最后一页的数据(利用覆盖索引,只包含id列),如下:

select id from product limit 866613, 20 0.2秒

相对于查询了所有列的37.44秒,提升了大概100多倍的速度

那么如果我们也要查询所有列,有两种方法,一种是id>=的形式,另一种就是利用join,看下实际情况:

SELECT * FROM product WHERE ID > =(select id from product limit 866613, 1) limit 20

查询时间为0.2秒,简直是一个质的飞跃啊,哈哈

另一种写法

SELECT * FROM product a JOIN (select id from product limit 866613, 20) b ON a.ID = b.id

查询时间也很短,赞!

其实两者用的都是一个原理,所以效果也差不多,核心思想就是将分页的压力放在id上,而id有唯一索引,可以将分页带来的效率问题降到最低。不过第一种要求id连续递增的,如果你的id使用的是UUID则无法满足,第二种相对来说使用范围更广,推荐使用!

文章转载自:http://www.cnblogs.com/lyroge/p/3837886.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148746.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mybatis update没有打印影响行数[通俗易懂]

    今天在排除问题的时候,发现有一个mybatisupdate语句没有打印出影响行数,原因是mapper.xml文件中update语句的标签是<select>…..</sele

    2022年2月16日
    36
  • java冒泡排序经典代码_java冒泡排序[通俗易懂]

    java冒泡排序经典代码_java冒泡排序[通俗易懂]经典算法——冒泡排序(BubbleSort)一、示例代码(伸手党看这里)1.示例一importjava.util.Arrays;publicclassBubbleSort{publicstaticvoidbubbleSort(int[]arr){inttemp;/*临时变量,交换数据时使用*/intlength=arr.length;for(intp=length-1…

    2022年6月22日
    36
  • dubbo被阿里放弃原因_阿里巴巴面试官必问的Dubbo灵魂拷问面试题,你能答出多少?…[通俗易懂]

    dubbo被阿里放弃原因_阿里巴巴面试官必问的Dubbo灵魂拷问面试题,你能答出多少?…[通俗易懂]前言Dubbo用起来就和EJB、WebService差不多,调用一个远程的服务(或者JavaBean)的时候在本地有一个接口,就像调用本地的方法一样去调用,它底层帮你实现好你的方法参数传输和远程服务运行结果传回之后的返回,就是RPC的一种封装当然,这个只是Dubbo的最基本的功能,它的特点是:它主要是使用高效的网络框架和序列化框架,让分布式服务之间调用效率更高。采用注册中心管理众多的服务接口地址,…

    2022年4月19日
    107
  • oracle数据库904_oracle00933怎么解决

    oracle数据库904_oracle00933怎么解决今天早上在日志中发现exp备份时出错:..exportingtableBJ_AFFILIATES37rowsexportedEXP-00008:ORACLEerror904encounteredORA-00904::invalididentifier..exportingtable…

    2022年9月20日
    0
  • C#常用 API函数大全[通俗易懂]

    C#常用 API函数大全[通俗易懂]常用WindowsAPI1.API之网络函数WNetAddConnection创建同一个网络资源的永久性连接WNetAddConnection2创建同一个网络资源的连接WNetAddConnection3创建同一个网络资源的连接WNetCancelConnection结束一个网络连接WNetCancelConnection2结束一个网络连接WNetCloseEn

    2025年6月25日
    0
  • eclipse连接SQL server数据库「建议收藏」

    1.准备,下载JDBC驱动程序要能够使用数据库就要有相应的JDBC驱动程序,然后到Microsoft官网下载https://www.microsoft.com/zh-cn/download/details.aspx?id=11774下载完成之后用解压工具解压之后点击该文件夹然后进入2.配置SQLsever是否可以sa登录,如果不是参考以下链接htt…

    2022年4月15日
    105

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号