mysql千万级数据分页查询性能优化

 更新时间:2017年11月08日 08:43:18   作者:JavaRanger  
本文给大家分享的是作者在使用mysql进行千万级数据量分页查询的时候进行性能优化的方法,非常不错的一篇文章,对我们学习mysql性能优化非常有帮助

mysql数据量大时使用limit分页,随着页码的增大,查询效率越低下。

实验

1.直接使用用limit start, count分页语句:

select * from order limit start, count

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

select * from order limit 10, 20 0.016秒

select * from order limit 100, 20 0.016秒

select * from order limit 1000, 20 0.047秒

select * from order limit 10000, 20 0.094秒

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

select * from order limit 400000, 20 3.229秒

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

select * from order limit 800000, 20 37.44秒

显然这种时间是无法忍受的。

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

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

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

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

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

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

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

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

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

select id from order limit 800000, 20 0.2秒

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

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

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

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

另一种写法

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

查询时间也很短

相关文章

  • MySQL数据库分区功能的使用教程

    MySQL数据库分区功能的使用教程

    这篇文章主要介绍了MySQL数据库分区功能的使用教程,文中特别讲解了MySQL分表和分区的区别以及联系,需要的朋友可以参考下
    2016-05-05
  • MYSQL多表联查on和where的区别小结

    MYSQL多表联查on和where的区别小结

    在使用left join时过滤条件放到on后面还是where后面是有区别的,如果没有搞清楚他们的区别,连表汇总的结果就会变少或者变多,本文就来详细介绍一下两者的区别,感兴趣的可以了解一下
    2023-11-11
  • ktl工具实现mysql向mysql同步数据方法

    ktl工具实现mysql向mysql同步数据方法

    在本篇内容里我们给大家介绍了用ktl工具实现mysql向mysql同步数据的具体步骤,有需要的朋友们跟着学习参考下。
    2019-03-03
  • MySQL服务无法启动的解决办法(亲测有效)

    MySQL服务无法启动的解决办法(亲测有效)

    用管理员身份打开cmd试图启动MySQL时出现服务无法启动并提示服务没有报错任何错误,所以本文小编给大家介绍了一个亲测有效的解决办法,需要的朋友可以参考下
    2023-12-12
  • MySQL使用IF语句及用case语句对条件并结果进行判断 

    MySQL使用IF语句及用case语句对条件并结果进行判断 

    这篇文章主要介绍了MySQL使用IF语句及用case语句对条件并结果进行判断,文章通过围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • MySQL中实现动态表单中JSON元素精准匹配的方法示例

    MySQL中实现动态表单中JSON元素精准匹配的方法示例

    本文主要介绍了MySQL中实现动态表单中JSON元素精准匹配的方法示例,重点讲解如何在将设计好的动态表单信息进行提取,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • 防止web项目中的SQL注入

    防止web项目中的SQL注入

    这篇文章介绍了防止web项目中的SQL注入,小编觉得挺不错的,现在分享给大家,也给大家做个参考。需要的朋友可以收藏下,方便下次浏览观看
    2021-12-12
  • Mysql如何获取json字符串/数组的值

    Mysql如何获取json字符串/数组的值

    这篇文章主要介绍了Mysql如何获取json字符串/数组的值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Mysql主从同步的实现原理

    Mysql主从同步的实现原理

    这篇文章主要介绍了Mysql主从同步的实现原理,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • MySQL5.7.14下载安装图文教程及MySQL数据库语句入门大全

    MySQL5.7.14下载安装图文教程及MySQL数据库语句入门大全

    这篇文章主要介绍了MySQL5.7.14下载安装详细教程及MySQL数据库语句入门大全的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09

最新评论