文档章节

MySQL单表百万数据记录分页性能优化

ZYallers
 ZYallers
发布于 2017/07/25 15:20
字数 913
阅读 1
收藏 0

MySQL单表百万数据记录分页性能优化

背景

自己的一个网站,由于单表的数据记录高达了一百万条,造成数据访问很慢,Google分析的后台经常报告超时,尤其是页码大的页面更是慢的不行。

测试环境

先让我们熟悉下基本的sql语句,来查看下我们将要测试表的基本信息

use infomation_schema
SELECT * FROM TABLES WHERE TABLE_SCHEMA = ‘dbname’ AND TABLE_NAME = ‘product’

查询结果从上图中我们可以看到表的基本信息:

  • 表行数:866633
  • 平均每行的数据长度:5133字节
  • 单表大小:4448700632字节

关于行和表大小的单位都是字节,我们经过计算可以知道

  • 平均行长度:大约5k
  • 单表总大小:4.1g 表中字段各种类型都有varchar、datetime、text等,id字段为主键

测试实验

直接用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语句是很方便,但是对记录很多的表并不适合直接使用

对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

查询时间也很短,赞!其实两者用的都是一个原理嘛,所以效果也差不多。

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

共有 人打赏支持
ZYallers
粉丝 1
博文 59
码字总数 19100
作品 0
佛山
程序员
私信 提问
mysql 单表百万级记录查询分页优化

insert select (制造百万条记录) 在开始百万级数据的查询之前,自己先动手制造百万级的记录来供我们使用,使用的方法是insert select方法 INSERT 一般用来给表插入一个指定列值的行。但是,...

nao
2015/09/22
509
0
MySQL 百万级分页优化(Mysql千万级快速分页)

一般刚开始学SQL的时候,会这样写复制代码 代码如下: 但在数据达到百万级的时候,这样写会慢死复制代码 代码如下: 也许耗费几十秒 网上很多优化的方法是这样的复制代码 代码如下: 是的,速度...

yiqifendou
2016/10/11
86
0
MySQL limit 优化,百万至千万级快速分页:复合索引

MySQL 性能到底能有多高?用了php半年多,真正如此深入的去思考这个问题还是从前天开始。有过痛苦有过绝望,到现在充满信心!MySql 这个数据库绝对是适合dba级的高手去玩的,一般做一点1万篇...

大数据之路
2012/12/19
0
4
mysql 优化实例(百万级数据)

MySql 这个数据库绝对是适合dba级的高手去玩的,一般做一点1万篇新闻的小型系统怎么写都可以,用xx框架可以实现快速开发。可是数据量到了10万,百万至千万,他的性能还能那么高吗?一点小小的...

tantexian
2016/04/22
310
0
Mysql limit 优化,百万至千万级快速分页 复合索引的引用并应用于轻量级框架

MySql 这个数据库绝对是适合dba级的高手去玩的,一般做一点1万篇新闻的小型系统怎么写都可以,用xx框架可以实现快速开发。可是数据量到了10万,百万至千 万,他的性能还能那么高吗?一点小小...

豆花饭烧土豆
2016/02/22
231
2

没有更多内容

加载失败,请刷新页面

加载更多

解析JQuery中each方法的使用

each() 方法规定为每个匹配元素规定运行的函数。写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。 概述: each() 方法规定为每个匹配...

前端攻城小牛
11分钟前
3
0
深入解析Vue开发动态刷新Echarts组件的教程

需求背景:dashboard作为目前企业中后台产品的“门面”,如何更加实时、高效、炫酷的对统计数据进行展示,是值得前端开发工程师和UI设计师共同思考的一个问题。今天就从0开始,封装一个动态渲...

peakedness丶
24分钟前
3
0
memcached

memcached 为了避免内存碎片化(传统的内存管理方式是,使用完通过malloc分配的内存后通过free来回收内存,这种方式容易产生内存碎片并降低操作系统对内存的管理效率),采用了 slab allocatio...

Cobbage
25分钟前
3
0
keepalived的介绍及配置高可用集群

12月19日任务 18.1 集群介绍 18.2 keepalived介绍 18.3/18.4/18.5 用keepalived配置高可用集群 集群介绍 根据功能划分为2类:高可用和负载均衡 高可用集群:通常为两台服务器,一台工作,另外...

robertt15
26分钟前
5
0
WiFi攻击的三种方式

导读 WiFi的安全问题已经引起了不少的使用者重视,甚至已经出现草木皆兵的现象。那么黑客到底是如何做到绕过身份验证来获取WiFi使用权的呢?主要有以下三种方式,其中最后一种方式十分简单。 ...

问题终结者
40分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部