mysql大数据量之limit优化
背景:当数据库里面的数据达到几百万条上千万条的时候,如果要分页的时候(不过一般分页不会有这么多),如果业务要求这么做那我们需要如何解决呢?
我用的本地一个自己生产的一张表有五百多万的表,来进行测试,表名为big_data;
首先我们看如下几条sql语句:
在这之前我们开启profiling来监测sql语句执行的情况。
set profiling=1;
1.查询从第10w条数据开始分页10条
2.查询从第20w条数据分页10条
3.查询从第30w条数据分页10条
3.查询从第300w条数据分页10条
3.查询从第500w条数据分页10条
我们可以看出查询从200w开始分页的都还比较快,但从500w开始速度就变的很慢了,这个是不太让人满意的。
mysql> select id,my_name from big_data limit 5000000,10;
+---------+------------+
| id | my_name |
+---------+------------+
| 5000001 | kwCwziqhNu |
| 5000002 | NLpqMMwaJv |
| 5000003 | kskUTLXDbx |
| 5000004 | PtAvBtpubZ |
| 5000005 | whsuShiuvX |
| 5000006 | TcDLWzHNQT |
| 5000007 | qHmnEkjsmh |
| 5000008 | UQrmluqvgr |
| 5000009 | UzKeqpEbtQ |
| 5000010 | SkuvSePMpq |
+---------+------------+
10 rows in set (2.34 sec)
mysql> show profiles;
+----------+------------+--------------------------------------------------+
| Query_ID | Duration | Query |
+----------+------------+--------------------------------------------------+
| 1 | 0.02591075 | select id,my_name from big_data limit 100000,10 |
| 2 | 0.05773150 | select id,my_name from big_data limit 200000,10 |
| 3 | 0.08253525 | select id,my_name from big_data limit 300000,10 |
| 4 | 1.38455375 | select id,my_name from big_data limit 3000000,10 |
| 5 | 2.34040775 | select id,my_name from big_data limit 5000000,10 |
+----------+------------+--------------------------------------------------+
5 rows in set, 1 warning (0.00 sec)
show profiles;
我们就如下两种解决方法:
(1)、通过判断id的范围来分页
select id,my_sn from big_data where id>5000000 limit 10;
也得到了分页的数据,但是我们发现如果id不是顺序的,也就是如果有数据删除过的话,那么这样分页数据就会不正确,这个是有缺陷的。
(2)、通过连接查询来分页
我们可以先查询500w条数据开始分页的那10个id,然后通过连接查询显示数据
mysql> select b.id,b.my_name from big_data as b inner join (select id from big_data order by id limit 4500000,10) as tmp on tmp.id=b.id;
我们测试不同起始端的分页数据
mysql> select b.id,b.my_name from big_data as b inner join (select id from big_data order by id limit 5000000,10) as tmp on tmp.id=b.id;
+---------+------------+
| id | my_name |
+---------+------------+
| 5000001 | kwCwziqhNu |
| 5000002 | NLpqMMwaJv |
| 5000003 | kskUTLXDbx |
| 5000004 | PtAvBtpubZ |
| 5000005 | whsuShiuvX |
| 5000006 | TcDLWzHNQT |
| 5000007 | qHmnEkjsmh |
| 5000008 | UQrmluqvgr |
| 5000009 | UzKeqpEbtQ |
| 5000010 | SkuvSePMpq |
+---------+------------+
10 rows in set (2.15 sec)
mysql> show profiles;
+----------+------------+------------------------------------------------------------------------------------------------------------------------------------+
| Query_ID | Duration | Query |
+----------+------------+------------------------------------------------------------------------------------------------------------------------------------+
| 1 | 0.02591075 | select id,my_name from big_data limit 100000,10 |
| 2 | 0.05773150 | select id,my_name from big_data limit 200000,10 |
| 3 | 0.08253525 | select id,my_name from big_data limit 300000,10 |
| 4 | 1.38455375 | select id,my_name from big_data limit 3000000,10 |
| 5 | 2.34040775 | select id,my_name from big_data limit 5000000,10 |
| 6 | 0.00004200 | reset query cache |
| 7 | 0.01999275 | select b.id,b.my_name from big_data as b inner join (select id from big_data order by id limit 100000,10) as tmp on tmp.id=b.id |
| 8 | 0.03888825 | select b.id,b.my_name from big_data as b inner join (select id from big_data order by id limit 200000,10) as tmp on tmp.id=b.id |
| 9 | 0.37394450 | select b.id,b.my_name from big_data as b inner join (select id from big_data order by id limit 1000000,10) as tmp on tmp.id=b.id |
| 10 | 1.33475700 | select b.id,b.my_name from big_data as b inner join (select id from big_data order by id limit 3000000,10) as tmp on tmp.id=b.id |
| 11 | 2.14759000 | select b.id,b.my_name from big_data as b inner join (select id from big_data order by id limit 5000000,10) as tmp on tmp.id=b.id |
如果怀疑有缓存的缘故我们可以清楚缓存后来查询
reset query cache;
show profile for query 3;//查看被记录的第三条sql语句的执行情况
可以看出两种方法查出来的数据都是一致的,但通过方法二的速度比之前单表查询的速度快了一些。
分析:因为mysql分页查询是先把分页之前数据都查询出来了,然后截取后把不是分页的数据给扔掉后得到的结果这样,所以数据量太大了后分页缓慢是可以理解的。
但是我们可以先把需要分页的id查询出来,因为id是主键id主键索引,查询起来还是快很多的,然后根据id连接查询对应的分页数据,可见并不是所有的连接查询都会比
单查询要慢,要依情况而定。
mysql大数据量之limit优化的更多相关文章
- MySQL大数据量分页性能优化
mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1. 直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...
- mysql大数据量使用limit分页,随着页码的增大,查询效率越低下
1. 直接用limit start, count分页语句, 也是我程序中用的方法: select * from product limit start, count当起始页较小时,查询没有性能问题 ...
- 【MYSQL】mysql大数据量分页性能优化
转载地址: http://www.cnblogs.com/lpfuture/p/5772055.html https://www.cnblogs.com/shiwenhu/p/5757250.html ...
- MySQL 大数据量使用limit分页,随着页码的增大,查询效率越低下。
数据表结构 CREATE TABLE `ad_keyword` ( `id` int(11) NOT NULL AUTO_INCREMENT, `plan_goods_id` int(11) DEFA ...
- 【1】MySQL大数据量分页查询方法及其优化
---方法1: 直接使用数据库提供的SQL语句---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N---适应场景: 适用于数据量较少的情况(元组百/千 ...
- MySQL大数据量分页查询方法及其优化
MySQL大数据量分页查询方法及其优化 ---方法1: 直接使用数据库提供的SQL语句---语句样式: MySQL中,可用如下方法: SELECT * FROM 表名称 LIMIT M,N---适 ...
- MySQL大数据量分页查询
mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1. 直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...
- mysql大数据量下的分页
mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1. 直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...
- MySQL 大数据量快速插入方法和语句优化
MySQL大数据量快速插入方法和语句优化是本文我们主要要介绍的内容,接下来我们就来一一介绍,希望能够让您有所收获! INSERT语句的速度 插入一个记录需要的时间由下列因素组成,其中的数字表示大约比例 ...
随机推荐
- java中join用法
今天又把join的用法大概看了一下,其实理解起来,还是比较简单.用个简单的例子说明一下吧. 1.通过下面的例子,可以看到说出结果中首先全部是是Thread-1,之后才会是Thread-2,这是因为在主 ...
- 20165202 学习基础和c语言基础调查
你有什么技能比大多人(超过90%以上)更好? 我对自行车运动的兴趣始于初中时期,不敢说比大多数人更好,但在业余爱好者中相对来说还不错. 针对这个技能的获取你有什么成功的经验? 接触自行车运动几年里,我 ...
- 42.zip
最近看linux的解压缩,无意间了解到了一个和压缩率相关的小故事——42.zip 一般我们使用压缩工具的时候,都会用到无损压缩技术,对于无损压缩,算法非常重要,不同的算法实现 的压缩率和速度有很大差别 ...
- python中对文件的处理
1.当文件中存放的用户名的密码,是以字符串的形式存储时,怎么进行读取和操作 eg:MLing,123456 niuniu,234567 luoluo,345678 方法一:将字符串转为字典 1)字典查 ...
- oracle 查询XML操作、操作系统文件
--1.随机数 select dbms_random.value from dual; select mod(dbms_random.random, 10) from dual; --0-9随机数 s ...
- 【剑指offer】包含min函数的栈,C++实现
博客文章索引地址 博客文章中代码的github地址 1.题目 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数.在该栈中调用push.pop.top.min的时间复杂度都是o(1) ...
- ubuntu下erlang man的安装
下载 http://www.erlang.org/download/otp_doc_man_17.1.tar.gz 找到erlang 安装目录 解压 otp_doc_man_17.1.tar.gz s ...
- HDU1757
解题思路:分析需要不少时间,比较懒,直接把别人的分析贴在这里, 然后贴上自己写的代码: K相当之大.所以逐一递推的算法无法胜任.这时我们就不得不运用矩阵加速.首先来讲一下矩阵乘法: 若一矩阵的列数与另 ...
- 使用Percona Xtrabackup创建MySQL slave库
一.使用Percona Xtrabackup创建MySQL slave库 MySQL Server 版本: Server version: 5.7.10-log MySQL Community Ser ...
- 关于python机器学习常用算法的例子
Home Installation Documentation Examples Previous An introduction ... This documentation is for ...