mysql分页数据变化_mysql大量数据分页优化

当数据量增大,使用LIMIT offset,rows进行分页会导致性能下降。通过实验,展示了随着offset增加,查询耗时显著增长。文章探讨了子查询和JOIN方式的优化,以及依赖前次查询最大ID的终极优化方案,提升分页查询效率。
摘要由CSDN通过智能技术生成

原创 java金融 java金融 4月5日

一般我们数据量大的时候,然后就需要进行分页,一般分页语句就是limit offset,rows。这种分页数据量小的时候是没啥影响的,一旦数据量越来越大随着offset的变大,性能就会越来越差。下面我们就来实验下:

准备数据

a. 建一个测试表引擎为MyISAM(插入数据没有事务提交,插入速度快)的表。

1. CREATE TABLE USER (

2. id INT ( 20 ) NOT NULL auto_increment,

3. NAME VARCHAR ( 20 ) NOT NULL,

4. address VARCHAR ( 20 ) NOT NULL,

5. PRIMARY KEY ( id )

6. ) ENGINE = MyISAM;

2 . 写一个批量插入的存储过程

1. delimiter //

2. # 删除表数据

3. TRUNCATE TABLE t;

4. # 如果已经有sp_test_batch存储过程,将其删除,后面重新创建

5. DROP PROCEDURE IF EXISTS sp_test_batch;

6. # 创建存储过程,包含num和batch输入,num表示插入的总行数,batch表示每次插入的行数

7. CREATE PROCEDURE sp_test_batch(IN num INT,IN batch INT)

8. BEGIN

9. SET @insert_value = ‘‘;

10. # 已经插入的记录总行数

11. SET @count = 0;

12. #

13. SET @batch_count = 0;

14. WHILE @count < num DO

15. # 内while循环用于拼接INSERT INTO t VALUES (),(),(),...语句中VALUES后面部分

16. WHILE (@batch_count < batch AND @count < num) DO

17. IF @batch_count>0

18. THEN

19. SET @insert_value = concat(@insert_value,‘,‘);

20. END IF;

21. SET @insert_value = concat(@insert_value,"(‘name", @count, "‘,‘address", @count, "‘)");

22. SET @batch_count = @batch_count+1;

23. END WHILE;

24.

25. SET @count = @count + @batch_count;

26. # 拼接SQL语句并执行

27. SET @exesql = concat("insert into user(name,address) values ", @insert_value);

28. PREPARE stmt FROM @exesql;

29. EXECUTE stmt;

30. DEALLOCATE PREPARE stmt;

31. # 重置变量值

32. SET @insert_value = ‘‘;

33. SET @batch_count=0;

34. END WHILE;

35. # 数据插入完成后,查看表中总记录数

36. SELECT COUNT(id) FROM user;

37. END

38. CALL sp_test_batch(10000000,10000);

插入1000w数据

3 . 测试性能

下面我们分别针对于offset等于不同的值来进行实:offset等于10000时耗时

c27bae67c143b545ee3065849739c1d7.png

offset等于100000时耗时

39032dd173c706a544a62e1c900472fc.png

offset等于1000000时耗时

fe2c18e8735678231712ec42f0eb07b3.png

offset等于5000000时耗时

c4ac56dedabfc9f17a0391766b1fa5fb.png

offset等于10000000时耗时

3d10947d2cc819e541e4cc66318c39be.png

从上图可以得出随着offset的值越大耗时就越来越多。这还只是1000w数据,如果我们上亿数据呢,可想而知这时候查询的效率有多差。下面我们来进行优化。

4 .进行优化

子查询的分页方式:

e56e472a04ebc7270c73027bb4108cdc.png

970fff6d677faa833d6aed5fdcb98496.png

1.SELECT * FROM user WHERE id >=

2.(SELECT id FROM user ORDER BY id LIMIT 9000000, 1) LIMIT 10

从图可以得出子查询确实速度快了一倍。

JOIN分页方式:

SELECT * FROM user t1 INNER join

(SELECT id FROM user ORDER BY id LIMIT 9000000, 10) t2 on t2.id =t1.id

d36e1d10e28e7ade495b5bec186bc5c9.png

join的方式比子查询性能在稍微好点。

终极优化:

这个时间性能是最好的。这种优化必须要依赖前一次的查询的最大ID,如果是那种分页直接可以指定多少页的是不行的,必须是只能后一页,后一页这么点击。

1.SELECT id FROM user where id > 9000000 ORDER BY id LIMIT 10;

0bd9a3fd930f3a991fc8e2d8a2e6822f.png

mysql大量数据分页优化

标签:exe   方式   call   test   begin   inf   exists   mysq   incr

本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉

本文系统来源:https://blog.51cto.com/14987832/2558042

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值