百万数据量下,使用延迟关联优化超大分页

MySQL 并不是跳过 offset 行,而是取 offset + N 行,然后返回放弃前 offset 行,返回 N 行,那当offset 特别大的时候,效率就非常的低下

延迟关联

根本原理在于利用索引覆盖,避免二次回表,提高性能,延迟关联则是通过使用覆盖索引查询返回需要的主键,再根据主键关联原表获得需要的数据。

模拟百万条数据

表结构


DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (`id` int(0) NOT NULL AUTO_INCREMENT,`name` varchar(20) CHARACTER SET gb2312 COLLATE gb2312_chinese_ci NULL DEFAULT NULL,`age` int(0) NULL DEFAULT 0,`balance` decimal(12, 2) NULL,PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1212 CHARACTER SET = gb2312 COLLATE = gb2312_chinese_ci ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;

python脚本

# coding:utf-8
import pymysql
import random
import time# 装饰器,计算插入数据需要的时间
def timer(func):def decor(*args):start_time = time.time()func(*args)end_time = time.time()d_time = end_time - start_timeprint("the running time is : ", d_time, "秒")return decor@timer
def storage():# 连接数据库connect = pymysql.connect(host='localhost', port=3306, user="root", password="123456", db="stu",charset='utf8')# 使用cursor()方法创建一个游标对象values = []for i in range(100_00_00):user = [generateName(), random.randint(18, 30), random.randint(1, 2), "杭州下沙", generatePhone()]values.append(user)print(values)cursor = connect.cursor()# 使用execute()方法执行SQL语句try:cursor.executemany('INSERT INTO user_info(name,age,gender,address,tel) values (%s,%s,%s,%s,%s)', values)# 提交connect.commit()except Exception as e:print(e)# 数据回滚connect.rollback()def generateName():lastName = ['赵', '钱', '孙', '李', '周', '吴', '郑', '王', '冯', '陈', '褚', '卫', '蒋', '沈', '韩', '杨', '朱', '秦', '尤', '许', '何','吕', '施', '张', '孔', '曹', '严', '华', '金', '魏', '陶', '姜', '戚', '谢', '邹', '喻', '柏', '水', '窦', '章', '云', '苏','潘', '葛', '奚', '范', '彭', '郎', '鲁', '韦', '昌', '马', '苗', '凤', '花', '方', '俞', '任', '袁', '柳', '酆', '鲍', '史','唐', '费', '廉', '岑', '薛', '雷', '贺', '倪', '汤', '滕', '殷', '罗', '毕', '郝', '邬', '安', '常', '乐', '于', '时', '傅','皮', '卞', '齐', '康', '伍', '余', '元', '卜', '顾', '孟', '平', '黄', '和', '穆', '萧', '尹', '姚', '邵', '湛', '汪', '祁','毛', '禹', '狄', '米', '贝', '明', '臧', '计', '伏', '成', '戴', '谈', '宋', '茅', '庞', '熊', '纪', '舒', '屈', '项', '祝','董', '梁', '杜', '阮', '蓝', '闵', '席', '季', '麻', '强', '贾', '路', '娄', '危', '江', '童', '颜', '郭', '梅', '盛', '林','刁', '锺', '徐', '丘', '骆', '高', '夏', '蔡', '田', '樊', '胡', '凌', '霍', '虞', '万', '支', '柯', '昝', '管', '卢', '莫','经', '房', '裘', '缪', '干', '解', '应', '宗', '丁', '宣', '贲', '邓', '郁', '单', '杭', '洪', '包', '诸', '左', '石', '崔','吉', '钮', '龚', '程', '嵇', '邢', '滑', '裴', '陆', '荣', '翁', '荀', '羊', '於', '惠', '甄', '麹', '家', '封', '芮', '羿','储', '靳', '汲', '邴', '糜', '松', '井', '段', '富', '巫', '乌', '焦', '巴', '弓', '牧', '隗', '山', '谷', '车', '侯', '宓','蓬', '全', '郗', '班', '仰', '秋', '仲', '伊', '宫', '甯', '仇', '栾', '暴', '甘', '钭', '厉', '戎', '祖', '武', '符', '刘','景', '詹', '束', '龙', '叶', '幸', '司', '韶', '郜', '黎', '蓟', '薄', '印', '宿', '白', '怀', '蒲', '邰', '从', '鄂', '索','咸', '籍', '赖', '卓', '蔺', '屠', '蒙', '池', '乔', '阴', '鬱', '胥', '能', '苍', '双', '闻', '莘', '党', '翟', '谭', '贡','劳', '逄', '姬', '申', '扶', '堵', '冉', '宰', '郦', '雍', '郤', '璩', '桑', '桂', '濮', '牛', '寿', '通', '边', '扈', '燕','冀', '郏', '浦', '尚', '农', '温', '别', '庄', '晏', '柴', '瞿', '阎', '充', '慕', '连', '茹', '习', '宦', '艾', '鱼', '容','向', '古', '易', '慎', '戈', '廖', '庾', '终', '暨', '居', '衡', '步', '都', '耿', '满', '弘', '匡', '国', '文', '寇', '广','禄', '阙', '东', '欧', '殳', '沃', '利', '蔚', '越', '夔', '隆', '师', '巩', '厍', '聂', '晁', '勾', '敖', '融', '冷', '訾','辛', '阚', '那', '简', '饶', '空', '曾', '毋', '沙', '乜', '养', '鞠', '须', '丰', '巢', '关', '蒯', '相', '查', '后', '荆','红', '游', '竺', '权', '逯', '盖', '益', '桓', '公', '万俟', '司马', '上官', '欧阳', '夏侯', '诸葛', '闻人', '东方', '赫连', '皇甫','尉迟', '公羊', '澹台', '公冶', '宗政', '濮阳', '淳于', '单于', '太叔', '申屠', '公孙', '仲孙', '轩辕', '令狐', '锺离', '宇文', '长孙','慕容', '鲜于', '闾丘', '司徒', '司空', '亓官', '司寇', '仉', '督', '子车', '颛孙', '端木', '巫马', '公西', '漆雕', '乐正', '壤驷','公良', '拓跋', '夹谷', '宰父', '穀梁', '晋', '楚', '闫', '法', '汝', '鄢', '涂', '钦', '段干', '百里', '东郭', '南门', '呼延','归海', '羊舌', '微生', '岳', '帅', '缑', '亢', '况', '後', '有', '琴', '梁丘', '左丘', '东门', '西门', '商', '牟', '佘', '佴','伯', '赏', '南宫', '墨', '哈', '谯', '笪', '年', '爱', '阳', '佟', '第五', '言', '福']NAME_BODY_MING = ['壮', '昱杰', '开虎', '凯信', '永斌', '方洲', '长发', '可人', '天弘', '炫锐', '富明', '俊枫']NAME_GIRL_MING = ['小玉', '蓝', '琬郡', '琛青', '予舴', '妙妙', '梓茵', '海蓉', '语娜', '馨琦', '晓馥', '佳翊']lastNameSize = len(lastName) - 1boySize = len(NAME_BODY_MING) - 1girlSize = len(NAME_GIRL_MING) - 1# 随机选择一个男孩的名字或者女孩的名字flag = random.randint(0, 1)return lastName[random.randint(1, lastNameSize)] + NAME_BODY_MING[random.randint(0, boySize)] if flag == 0 else \lastName[random.randint(1, lastNameSize)] + NAME_GIRL_MING[random.randint(0, girlSize)]def generatePhone():return str(1) + str(random.randint(100000000, 999999999))if __name__ == "__main__":storage()

测试

# 基础命令
select * from user_info limit 800000;# 延迟关联
SELECT a.* FROM user_info a, (select id from user_info LIMIT 800000) b where a.id=b.id;# 子查询
SELECT * FROM user_info
WHERE id >= (SELECT id FROM user_info limit 800000, 1)
LIMIT 20; 

结果
普通分页:1.046s,1.009s,1.023s
延迟关联:0.261s,0.293s,0.227s
子查询:0.296s,0.271,0.287s

粗浅的结论
延迟关联 = 子查询 = 3 倍的普通分页

总结

1、在百万级别的数据下,甚至更大的数据量下,利用索引覆盖的优势,可以显著的提高分页的效率。

2、实际过程中,如果数据量真的很大(分页后有上千甚至上万页),我们从业务的角度出发,用户可能并不关心最后几页的数据,也很少回去从后往前翻,所以我们都不需要去提供尾页的功能,而是仅提供下一页,如百度

ps:
个人感觉即使是300毫秒仍然不是特别满意,如果有更好的解决方案,希望不吝赐教!

百万数据量下,使用延迟关联优化超大分页相关推荐

  1. mysql大数据量下的操作以及优化

    当我们操作mysql的时候,如果数据量很小,那么我们如何处理都没有问题.但是当一张表非常大的时候,我们一个大查询,一个堆大插入,一个count(*),一个limit都是非常恐怖的,因此,我在下面说几种 ...

  2. 记一次百万数据量查询sql 优化

    记一次百万数据量查询sql 优化 问题描述 问题分析过程 总结 简单了解用到的pgsql 的索引结构 pgsql 的with 扩展 对于更大数据量的数据还有没有其他更好的方案 问题描述 数据库用的是p ...

  3. 现身说法:实际业务出发分析百亿数据量下的多表查询优化

    今天给大家带来的讨论主题是通过实战经验来对百亿数据量下的多表数据查询进行优化,俗话说的好,一切脱离业务的架构都是耍流氓,接下来我就整理一下今天早上微信群里石头哥给大家分享的百亿数据量多表查询架构以及优 ...

  4. 数据量高并发的数据库优化

    数据量高并发的数据库优化一.数据库结构的设计如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会影响系统实际运行的性能.所以,在一个系统开始实施之前,完备的数据 ...

  5. 大数据量高并发的数据库优化(转载)

    对其进行处理是一项艰巨而复杂的任务.原因有以下几个方面: 一.数据量过大,数据中什么情况都可能存在.如果说有10条数据,那么大不了每条去逐一检查,人为处理,如果有上百条数据,也可以考虑,如果数据上到千 ...

  6. Flink流式处理百万数据量CSV文件

    前言 最近公司让做一个'没有必要'的需求 需求针对的对象 这是同一个csv文件的不同展示形式 Excel展示形式 文本展示形式 这个csv文件中可能有数百万条数据 需求 将所有的异常数据检测出来 什么 ...

  7. 大数据量下水晶报表的实现及显示过程中的进度条显示讨论

    最近一段收到的反馈中,有几位是问到在应用程序中使用水晶报表时,大数据量情况下因为等待时间过长,给用户的感觉不好 所以想增加一个进度条,给用户一个比较直观的印象. 本文针对此问题而生,但是并没有一个像样 ...

  8. Java操作百万数据量Excel导入导出工具类(程序代码教程)

    Java操作百万数据量Excel导入导出工具类(程序代码教程): # 功能实现1.自定义导入数据格式,支持配置时间.小数点类型(支持单/多sheet)(2种方式:本地文件路径导入(只支持xls.xls ...

  9. 达观数据CTO纪达麒:小标注数据量下自然语言处理实战经验

    自然语言处理在文本信息抽取.自动审校.智能问答.情感分析等场景下都有非常多的实际应用需求,在人工智能领域里有极为广泛的应用场景.然而在实际工程应用中,最经常面临的挑战是我们往往很难有大量高质量的标注语 ...

最新文章

  1. php对象当参数传递 php深复制和浅复制
  2. java web 利用ajax 异步向后台提交数据
  3. asp单元格合并后宽度没有合并_ElementUI Table组件如何使用合并行或列功能深入解析...
  4. react ui框架 移动端_你必须要知道的移动端UI组件设计宝典
  5. 大数据应用项目创新大赛_温州首届大数据应用创新大赛决赛名单公布!有你的单位吗?...
  6. Linux内核分析(三)----初识linux内存管理子系统
  7. 排序算法值--堆排序
  8. linux 打开 protel文件格式,Protel快捷键大全
  9. @SuppressWarnings(rawtypes)
  10. [转载] dataframe中有关inf的处理技巧
  11. Struts2校验器(一)之规格文件
  12. (十六)java版b2b2c社交电商spring cloud分布式微服务-用restTemplate消费服务
  13. java飞机大战boos代码_飞机大战 java 源代码
  14. QQ游戏大厅的你画我猜游戏白屏问题解决
  15. 打印机修复工具_打印机常见故障排除及修复方法
  16. 数据结构单向链表(C++)
  17. java框体怎么添加背景图,文本框添加背景图片,文本框背景图片,public class
  18. 程序设计入门——C语言 翁恺 第一次单元测试
  19. unc 目录不受支持_经验 |【解决报错】'\\Mac\Home\Desktop' 用作为当前目录的以上路径启动了 CMD.EXE。 UNC 路径不受支持。默认值设为 Windows 目录。...
  20. 以管理为轴心 为IT服务保驾护航——北京赛特百货有限公司

热门文章

  1. QT5/C++项目:基于QT的跨平台网络对战象棋(一)(推荐★★★★)
  2. ubuntu 安装phpstorm + 破解
  3. 高中计算机课程书籍,高中信息技术教材分析(整书).doc
  4. ​如何下载顺义区卫星地图高清版大图
  5. 深入 JavaScript 高级语法
  6. 企业数据中台解决方案PPT(附下载)
  7. 有没有人跟我一样,每天早上5点多就起床了,洗刷后匆匆忙忙出门赶公交挤地铁...
  8. win7怎么显示隐藏文件夹
  9. vite-----TypeScript
  10. 微信小程序阿里云服务器https搭建