MySQL(4)索引实践(2)

2023-09-18 00:00:27


一、分页优化
limit 1000 10, 其实不是只查询出10条记录,mysql底层会查询出1100条,然后舍去前1000条
所以,随着页的增多,查询效率会降低
1、可以使用取范围的方式比如id>1000 方式优化
2、使用关联查询优化,子表使用覆盖索引,不用查出来所有数据,主表关联子表查询出数据
二、关联表执行过程
(1)两种算法
1、嵌套循环连接 Nested-Loop Join(NLJ) 算法
一次一行循环地从第一张表(称为驱动表)中读取行,在这行数据中取到关联字段,根据关联字段在另一张表(被驱动
表)里取出满足条件的行,然后取出两张表的结果合集
2、基于块的嵌套循环连接 Block Nested-Loop Join(BNL)算法
把驱动表的数据读入到 join_buffer 中,然后扫描被驱动表,把被驱动表每一行取出来跟 join_buffer 中的数据做对比
,join_buffer默认是256k,如果驱动表中数据大于join_buffer的容量,会分配取数据到join_buffer

例如:select * from t1 inner join t2 on t1.a= t2.a;
驱动表先执行
优化器一般会优先选择小表做驱动表。所以使用 inner join 时,排在前面的表并不一定就是驱动表。
当使用left join时,左表是驱动表,右表是被驱动表,
当使用right join时,右表时驱动表,左表是被驱动表,
当使用join时,mysql会选择数据量比较小的表作为驱动表,大表作为被驱动表。


在被驱动表的关联字段中有索引的情况下
上面sql的大致流程如下:
1. 从表 t2 中读取一行数据(如果t2表有查询过滤条件的,会从过滤结果里取出一行数据);
2. 从第 1 步的数据中,取出关联字段 a,到表 t1 中查找;
3. 取出表 t1 中满足条件的行,跟 t2 中获取到的结果合并,作为结果返回给客户端;
4. 重复上面 3 步。
如果被驱动表关联字段没有索引
上面sql的大致流程如下:
1. 把 t2 的所有数据放入到 join_buffer 中
2. 把表 t1 中每一行取出来,跟 join_buffer 中的数据做对比
3. 返回满足 join 条件的数据
(2)关联sql的优化
1、关联字段加索引
2、小表驱动大表,可以使用straight_join 明确驱动表,例如select * from t2 straight_join t1 on t2.a = t1.a; 代表指定mysql选着 t2 表作为驱动表。
,只适用inner join,left right join已经明确了驱动表和被驱动表
(3)in 和 exsits优化
原则小表驱动大表
in:当B表的数据集小于A表的数据集时,in优于exists
select * from A where id in (select id from B)
等价于:
for(select id from B){
 select * from A where A.id = B.id
}
exists:当A表的数据集小于B表的数据集时,exists优于in
将主查询A的数据,放到子查询B中做条件验证,根据验证结果(true或false)来决定主查询的数据是否保留
select * from A where exists (select 1 from B where B.id = A.id)
等价于:
for(select * from A){
    select * from B where B.id = A.id
}
1、EXISTS (subquery)只返回TRUE或FALSE,因此子查询中的SELECT * 也可以用SELECT 1替换,官方说法是实际执行时会
忽略SELECT清单,因此没有区别
2、EXISTS子查询的实际执行过程可能经过了优化而不是我们理解上的逐条对比
3、EXISTS子查询往往也可以用JOIN来代替,何种最优需要具体问题具体分析

三、count
1、对比效率
(1)select count(1) from user;
(2)select count(id) from user;
(3)select count(name) from user;
(4)select count(*) from user;
效率对比,如果name有索引  4=1>3>2, 如果没有 4=1>2>3
count(*)mysql做了优化,不会把所有字段查出来,不取值,按行累加
count(1)也是不取值,按行累加,
count(name)会把name值取出来,累加
count(id)会把id取出来,累加
因为count(id)走的主键索引,count(name)走的二级索引,二级索引数据量相对小
所以count(name)会快一点,但是count(id)mysql也会优化,不走主键索引走二级索引,如果有的话
注意一点的count(字段)如果字段值为null,不计分count,而count(*)会计入null值
2、优化count
如果表数据大,count需要优化
myisam储存引擎表不带where条件的count查询很快,因为总行数会被mysql储存在磁盘上
如果是innodb,不会维护count,因为有mvcc
如果不需要精确获取的话,可以用 show table status like 'table名';获取count
如果需要请求可以把count维护在redis或者数据表中
 

更多推荐

Python日期处理库:掌握时间的艺术

💂个人网站:【工具大全】【游戏大全】【神级源码资源网】🤟前端学习课程:👉【28个案例趣学前端】【400个JS面试题】💅寻找学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】日期和时间在计算机编程中起着至关重要的作用,无论您是在开发应用程序、分析数据还是进行自动化任务,都需要处理日期和时间。Python作为一门

vue-h5移动Web的Flex布局

Flex布局Flexible布局,也就是弹性布局。Flexible的优点是,不需要对元素设置固定的宽度和高度,元素的位置和大小也会跟着父元素或者浏览器的状态来自动适配。同时还添加了水平居中和垂直居中的解决方案。在页面中指定一个元素作为Flex布局,那么这个元素就是作为容器冤元素。设置如下:.box{display:fl

Vuex详解:Vue.js的状态管理方案

🌷🍁博主猫头虎(🐅🐾)带您GotoNewWorld✨🍁🦄博客首页——🐅🐾猫头虎的博客🎐🐳《面试题大全专栏》🦕文章图文并茂🦖生动形象🐅简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》🐾学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》🐅学会Gol

从数字化到智能化再到智慧化,智慧公厕让城市基础配套更“聪明”

随着科技的迅猛发展,城市生活方式与配置设施的方方面,面也在不断的改变和升级。智慧公厕作为城市基础配套设施的一部分,从数字化到智能化再到智慧化,正逐渐展现出其独特的魅力和优势。实现了公共厕所建设、使用与管理方式的全面变革,本文将以智慧公厕领航厂家广州中期科技有限公司,大量的精品案例项目的实景实例实图,深入探讨智慧公厕的定

CSS 之 grid 网格布局

一、简介​display:grid;用于设置元素内部的布局类型为网格布局,其外显类型为块级元素。该类型的元素将内部分为行和列,划分成一个个单元格,并通过一系列相关属性控制单元格及其内容的布局和大小。​该属性值的主要应用场景为:多行多列元素排列布局。采用grid布局的元素,被称为“容器”(container),其内部的直

Maven 使用

一、初始Maven(了解)1、项目遇到的问题构建:编译代码,运行测试,打包,部署应用,运行服务器等;依赖:项目依赖大量的第三方包,第三方包又依赖另外的包,对依赖包的管理非常麻烦。2、Maven定义和作用Maven翻译为“知识的积累”,“专家”,“行家”,是一个跨平台的项目管理工具;Maven主要用作基于Java平台的项

用于图像分类的预训练模型(PyTorch实现)

用于图像分类的预训练模型(PyTorch实现)在本文中,我们将介绍一些使用TorchVision模块中存在的预训练网络的实践示例——用于图像分类的预训练模型。1.基于预训练模型进行图像分类预训练模型是在ImageNet等大型基准数据集上训练的神经网络模型。深度学习社区从这些开源模型中受益匪浅。此外,预训练模型是计算机视

EPC与5GC/5GS互联互通

一、5GS与EPC/E-UTRAN互通的非漫游架构1.N26接口是MME和5GSAMF之间的CN间接口,以实现EPC和NG核心之间的互通。网络中支持N26接口是可选的,用于互通。N26支持在S10上支持的功能的子集(对于互通是必要的)。2.PGW-C+SMF和UPF+PGW-U专用于5GS和EPC之间的互通,这是可选的

人工智能术语翻译(五)

文章目录摘要QRST摘要人工智能术语翻译第五部分,包括Q、R、S、T开头的词汇!Q英文术语中文翻译常用缩写备注QFunctionQ函数Q-LearningQ学习Q-NetworkQ网络QuadraticLossFunction平方损失函数QuadraticProgramming二次规划QuadraturePair象限对

Anaconda下Jupyter Notebook执行OpenCV中cv2.imshow()报错(错误码为1272)网上解法汇总记录和最终处理方式

零、我设备的相关信息Python3.8.8Anaconda32021.05查询匹配python3.8.*的OpenCV匹配版本为:4.1.*—4.2.*,我最后安装4.2.0.32版本如下我记录了“从发现问题,到不断试错,最后解决问题”的完整过程,以备自己复盘使用,大家不愿费时的可直接查看总结版的处理方式记录一、问题起

【CNN-FPGA开源项目解析】02--floatAdd16模块

文章目录前言浮点数加法的思路floatAdd16完整代码floatMult16代码逐步解析指数化为一致底数相加,处理进位溢出结果标准化和舍位整合为最后的16位浮点数结果[sign,exponent,fraction]其他变量宽度表特殊情况处理always敏感列表前言​上一篇文章(floatMult16模块解析)内,已经

热文推荐