主键索引 or 辅助索引?一文告诉你 Mysql limit 优化时的索引选择!

作者 | 吴海存

责编 | 徐威龙

封图| CSDN下载于视觉中国

导读:

本文主要针对limit分页时,是优先基于主键索引还是辅助索引等层面展开分析,对limit及offset的用法以及是否该用索引不会过多赘述。

我们知道,在Mysql中可以通过limit实现快速分页,但是如果表中数据量较大,则分页后期可能会十分缓慢,这是由limit的工作机制决定的,比如limit 500000,5的意思扫描满足条件的500005行,扔掉前面的500000行,返回最后的5行,所以我们在分页的时候,需要通过相应的索引来快速定位到第500000行,然后将后面的5行数据输出即可。

那我们在选则索引的时候,是使用主键索引还是使用辅助索引呢?若使用辅助索引,那对该辅助索引有没有什么限制呢?比如该索引所基于的列是不是应该有not null约束呢?因为我们知道,在分页的时候,要求数据是连续的,而索引里面是不记录null值的,所以若索引没有not null约束,则有可能不满足分页条件。

对于以上几个问题,我们通过如下的示例来一一验证说明,如有疏漏之处,望指正。


实验环境

MySQL版本:8.0.18

OS版本:CentOS 8.0

【实验步骤】

1.确认测试表emp中的数据量(若数据量太少,则对比效果不明显)

2.确认表上索引和not null约束信息

说明: id 上索引为主键索引

     empno上的索引ind2为唯一性非空索引

     ename 上的索引ind3为非空的普通索引

     salary  上的索引为可以为空的普通索引

3.收集最新的统计信息

为了测试的公平性,我们执行一次全表查询,模拟将表emp的page尽量多地缓存到buffer pool,否则可能会出现后执行的sql直接逻辑读取了先执行的sql通过物理IO读到buffer pool的page,会使得对比结果缺乏不可靠性。

为了体现测试效果,我们选择扫描700W+5行,然后舍弃前面的700W行,返回后面满足条件的5行。

4.1在分页的时候通过ID列选择使用主键索引

select * from emp where id >= (select id from emp order by id limit 7000000,1) limit 5;

相应的执行计划使用了主键索引PRIMARY:

可以看到,使用ID主键索引的时候,用时为2.87秒。 

4.2使用非空唯一性索引

select * from emp where empno >= (select empno from emp order by empno limit 7000000,1) limit 5; 

相应执行计划使用了非空唯一性索引ind2:

当使用非主键以外的非空唯一性索引时,用时0.85秒。 

4.3使用非空非唯一的索引 

select * from emp where ename >= (select ename from emp order by ename limit 7000000,1) limit 5;

相应执行计划使用了非空非唯一性索引ind3:当使用非空非唯一性索引时,用时1.95秒。

4.4使用可为null的普通索引

先随机设置20行salary为null

查5条数据验证一下: 

更新统计信息:

使用可为null的普通索引进行分页:

执行计划使用了可为null非唯一性索引:

当使用可为null非唯一性索引时,用时1.18秒,使用的时间比非唯一性索引ind3时间较短的原因,是因为ind4的key_len是5,而ind3的key_len是82,ind3需要读取更多的page。

4.5验证使用可为null的普通索引是否会丢失数据

这里有一个问题,就是ind4里会有null值,使用该列进行分页的话,是不是由可能会丢失数据呢?使用如下步骤进行验证:

增到表中salary为null的行数到100

对salary进行排序,然后选择扫描7999910行,然后舍弃前面的7999890行,返回后面满足条件的20行,看数据库返回得行数:

可以发现,当使用可为null的非唯一性索引时,会将null值当作最小值参加排序,不会丢失数据。 

通过实验验证,我们可以得出如下结论:

1.当使用非主键的唯一性非空索引时,用作分页效率最高。

2.若使用primary key, 因为innodb时IOT表,所有全索引访问等同于全表扫描,效率低。

3.若同为普通索引,则和该索引的key长度,选择率等有关系,若该索引的选择率较高,则效率会高于primary key,原因同第二条。

4.使用可为null的非唯一性索引时,会将null值当作最小值参加排序,不会丢失数据。

对于本文,你有什么想法?欢迎在评论区和我讨论。

作者介绍:

吴海存,10g/11g/12c OCM, Oracle Exadata/Golden Gate 专家, 曾于Amazon和Oracle公司担任全球业务资深DBA,目前供职于中国农业银行,担任资深数据库专家。

同时,欢迎所有开发者扫描下方二维码填写《开发者与AI大调研》,只需2分钟,便可收获价值299元的「AI开发者万人大会」在线直播门票!

推荐阅读:如何成功构建大规模 Web 搜索引擎架构?
“出道” 5 年采用率达 78%,Kubernetes 的成功秘诀是什么?
一群阿里人如何用 10 年自研洛神云网络平台?技术架构演进全揭秘!拿下 Gartner 容器产品第一,阿里云打赢云原生关键一战!
大话卷积神经网络CNN,小白也能看懂的深度学习算法教程,全程干货建议收藏!
朱广权李佳琦直播掉线,1.2 亿人在线等
“抗疫”新战术:世卫组织联合IBM、甲骨文、微软构建了一个开放数据的区块链项目!
真香,朕在看了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518435.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

html-iframe内联框架

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>内联框架学习</title> </head> <body><!-- iframe内联框架 src : 地址 w-h : 宽度高度 --><iframe src"https://www.…

一个阿里产品经理眼中的“垃圾分类”

我叫切斯&#xff0c;是阿里巴巴的一名产品经理。今天和大家说说一个上线刚刚6天&#xff0c;已被500多万网友疯玩的AI——垃圾图像识别&#xff0c;可见垃圾分类苦天下网友久矣。 以下是一个产品经理的碎碎念~ 有人说它是“国内首款真正的垃圾图像识别产品”&#xff0c;对着…

html-初识表单post和get提交

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>登录注册</title> </head> <body> <h1>注册</h1> <!-- 表单formaction: 表单提交的位置&#xff0c;可以是网站&…

数据仓库架构以及多维数据模型的设计

作者 | 云祁封图| CSDN下载于视觉中国一、前言作者最近看了《Hadoop构建数据仓库实践》这本书&#xff0c;收获很多&#xff0c;把一些关于数仓实践的心得整理出来&#xff0c;方便大家共同学习。注&#xff1a;本文内容由作者摘自《Hadoop构建数据仓库实践》与其他相关参考资料…

html-文本框和单选框

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>登录注册</title> </head> <body> <h1>注册</h1> <!-- 表单form action: 表单提交的位置&#xff0c;可以是网站&am…

如何使用 Mybatis 实现数据库 CURD 操作?

作者 | 阿文&#xff0c;责编 | 郭芮头图 | CSDN 下载自东方IC出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;MyBatis 是一款优秀的持久层框架&#xff0c;它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的…

如何使用confd+ACM管理Nginx配置

Nginx 作为优秀的开源软件&#xff0c;凭借其高性能高并发等特点&#xff0c;常常作为web和反向代理服务部署在生产环境中。但是当 Nginx 的规模较大时&#xff0c; Nginx 的运维成本也是不断上升。本文介绍如何通过confdACM来管理 Nginx 配置&#xff0c;通过集中式的配置管理…

Soloπ:支付宝开源的Android专项测试工具

1.前言 近年来&#xff0c;随着移动互联网的蓬勃发展&#xff0c;移动测试技术也取得了长足的进步&#xff0c;从早期基于测试脚本的单机自动化&#xff0c;到录制回放、图像识别、云测平台等测试技术贴合实际业务需求深度应用和创新&#xff0c;测试效率从而一次又一次被提升…

详析 Kubernetes 在边缘计算领域的发展

作者 | 张杰来源 | 分布式实验室现在开源边缘计算正在经历其业界最具活力的发展阶段。如此多的开源平台&#xff0c;如此多的整合以及如此多的标准化举措&#xff01;这显示了构建更好平台的强大动力&#xff0c;以便将云计算带到边缘以满足不断增长的需求。同时Kubernetes现在…

Aliyun Serverless VSCode Extension 上架并开源

Aliyun Serverless VSCode Extension Aliyun Serverless VSCode Extension 是阿里云 Serverless 产品 函数计算 Function Compute 的 VSCode 插件&#xff0c;该插件是结合了函数计算 Fun 工具以及函数计算 SDK &#xff0c;为用户提供 VSCode 图形化开发调试函数计算以及操作…

QPS 提升60%,揭秘阿里巴巴轻量级开源 Web 服务器 Tengine 负载均衡算法

前言 在阿里七层流量入口接入层&#xff08;Application Gateway&#xff09;场景下&#xff0c; Nginx 官方的Smooth Weighted Round-Robin&#xff08; SWRR &#xff09;负载均衡算法已经无法再完美施展它的技能。 Tengine 通过实现新的负载均衡算法Virtual Node Smooth We…

支付宝的架构到底有多牛逼?还没看完我就跪了!

来源 | Java 之道自 2008 年双 11 以来&#xff0c;在每年双 11 超大规模流量的冲击上&#xff0c;蚂蚁金服都会不断突破现有技术的极限。2010 年双 11 的支付峰值为 2 万笔/分钟&#xff0c;到 2017 年双 11 时这个数字变为了 25.6 万笔/秒。2018 年双 11 的支付峰值为 48 万笔…

Android Native 内存泄漏系统化解决方案

导读&#xff1a;C内存泄漏问题的分析、定位一直是Android平台上困扰开发人员的难题。因为地图渲染、导航等核心功能对性能要求很高&#xff0c;高德地图APP中存在大量的C代码。解决这个问题对于产品质量尤为重要和关键&#xff0c;高德技术团队在实践中形成了一套自己的解决方…

【从入门到放弃-Java】并发编程-线程安全

概述 并发编程&#xff0c;即多条线程在同一时间段内“同时”运行。 在多处理器系统已经普及的今天&#xff0c;多线程能发挥出其优势&#xff0c;如&#xff1a;一个8核cpu的服务器&#xff0c;如果只使用单线程的话&#xff0c;将有7个处理器被闲置&#xff0c;只能发挥出服…

Kubernetes事件离线工具kube-eventer正式开源

前言 监控是保障系统稳定性的重要组成部分&#xff0c;在Kubernetes开源生态中&#xff0c;资源类的监控工具与组件百花齐放。除了社区自己孵化的metrics-server&#xff0c;还有从CNCF毕业的Prometheus等等&#xff0c;开发者可选的方案有很多。但是&#xff0c;只有资源类的…

国内首家,腾讯云云开发“全家桶”来了

作者 | 胡巍巍出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;虽然程序员这行加班多&#xff0c;但不要认为加班就该是常态。有些班&#xff0c;原本可以不加&#xff1b;有些夜&#xff0c;其实可以不熬。俗话说&#xff0c;工具不对&#xff0c;努力白费。如果有…

html-表单的应用

<!-- readonly 只读 --><p>名字: <input type"text" name"username1" value"wang洪亮" readonly></p><!-- disabled 禁用 &#xff0c; 按钮等地方也能用 --><p>性别:<input type"radio" v…

阿里研究员吴翰清:世界需要什么样的智能系统?

阿里妹导读&#xff1a;吴翰清&#xff0c;被大家亲切地称为“小黑”“道哥”。他是阿里巴巴研究员&#xff0c;更是一位“白帽黑客”。15岁&#xff0c;考入西安交大少年班&#xff0c;毕业后应聘阿里。23岁&#xff0c;成为阿里最年轻的高级技术专家。32岁&#xff0c;被评选…

咱们从头到尾说一次 Java 垃圾回收

之前上学的时候有这个一个梗&#xff0c;说在食堂里吃饭&#xff0c;吃完把餐盘端走清理的&#xff0c;是 C 程序员&#xff0c;吃完直接就走的&#xff0c;是 Java 程序员。 确实&#xff0c;在 Java 的世界里&#xff0c;似乎我们不用对垃圾回收那么的专注&#xff0c;很多初…

html-表单初级验证

<!-- placeholder 输入框 提示信息required 非空判断pattern 正则表达式--><p>名字: <input type"text" name"username1" placeholder"请输入名字" required></p><!-- pattern 正则表达式常用正则表达式…