查询性能优化的十条建议

2023-05-16

##三个原则

  • 1、单行访问是很慢的。最好读取的块中能尽可能包含多的所需要的行,使用索引可以创建位置引用以提升效率
  • 2、按顺序访问范围数据是很快的。
    <原因一>顺序I/O不需要多次磁盘寻道,比随机I/O要快很多;
    <原因二>如果服务器按需要顺序读取数据,那么就不需要在进行额外的排序操作,并且group by 操作也无需要做排序和将行按照组进行聚合计算。
  • 3、覆盖索引查询是很快的,因为无需回表查找行,避免了大量的单行访问。
    ###- (一). 关于COUNT()
    ###- (二). 关于UNION
    ###- (三). 关于LIMIT分页
    ###- (四). 关于关联查询
    ###- (五). 关于GROUP BY和DISTINCT
    ###- (六). 关于复杂查询和多个简单查询
    ###- (七). 在同一个表上查询与更新
    ###- (八). 关于查询缓存
    ###(一)、关于COUNT()
COUNT()作用有两个作用:其一就是统计某个列值的数量,它在统计列值时要求列值是非空的(不统计 NULL)。
					  其二就是统计结果集中的行数,当COUNT(表达式)中的表达式确认不可能为空时,实际上就是
					  统计行数。最简单清晰的用法就是COUNT(*)用来统计结果集中的数量。(注:mysql在解析
					  通配符‘*’的时候,不会扩展成所有的列,而是忽略所有的列直接统计行数)。
					  
COUNT()都需要扫描大量的行才能得到精确的结果,根据三个原则,访问大量的行,又不需要具体的列的信息,可以
通过覆盖索引来进行优化。


###(二)、关于UNION

MYSQL执行UNION操作的时候:创建并填充临时表的方式类实现。如果没有ALL关键字,MYSQL会给临时表加上
distinct选项,以此来对临时表的数据进行唯一性检查。这个代价非常高!注意:无论有没有ALL关键字,
MYSQL 都是使用临时表来存储结果。


###(三)、关于LIMIT分页
针对系统中需要进行分页操作的时候,通常采用LIMIT+偏移量的方式实现。但是对于偏移量非常大的时候(翻页靠后)例如 limit 10000,20这样的。这个时候mysql需要查询10020条数据,然后抛弃的前10000条。这样就非常不合适了。优化这种有两种:第一种在分页中限制分页的数量,第二种优化大偏移量的性能。
优化最简单的方案是使用索引覆盖扫描例如下面这个查询
这里写图片描述
可以改成
这里写图片描述
使用“延迟关联”来提高查询效率,它让mysql尽可能扫描少的页面,获取需要访问的记录后再根据关联回表查询需要的列。
LIMIT和OFFSET的问题,其实就是OFFSET的问题,它会导致mysql扫描大量不需要的数据然后再抛弃掉。有一种是根据单调递增的主键的特性,先记录上次取的数据的位置,作为下次扫描的起始位置。
例如:

	select id,status from orders  order by id asc limit 3000 ,30; 得到最大的id为117196
那下次查询就可以用
	select id,status from orders where id >117196  order by id asc limit 30;

###(四)、关于关联查询

关联查询是查询中的重中之重,以下只是几个原则
	1、确保on或者using 子句中的列上有索引,一般而言,只需要在关联顺序中的第二个表的相应的列上建立索引
	2、确保GROUP BY 和ORDER BY中的表达式只涉及到一个表的列。(若属于两个表,怎么使用
索引来优化这个查询过程)


###(五)、关于GROUP BY和DISTINCT

	在mysql中,当无法使用索引的时候,GROUP BY使用两种策略来完成:使用临时表或者文件排序来做分组,这两种
效率都可以优化。

	如果没有通过ORDER BY 子句显式的指定排序列,当查询使用GROUP BY子句的时候,结果集会自动按照分组的字段
不再进行文件排序,也可以直接在GROUP BY子句中直接使用DESC或者ASC,使分组的结果按照需要的方向排序。确保后面
的列属于同一个表。


###(六)、关于复杂查询和多个简单查询

	mysql在内存中检索数据时可以达到百万行数据,相对于将数据响应给客户端就慢的多了,在其他条件都相同的情况
下,使用尽可能少的查询是更好的,但是在应用设计的时候,一般采用将一个大的查询拆分为多个小的查询。这样有
很多的好处,例如可以多使用缓存,让缓存的效率更高;也可以减少锁的竞争;

	由于mysql的内部实现是“半双工”的,所以在同一件时间,要么服务器向客户端发送数据,要么客户端向服务器端
发送数据,这两个动作无法同时发生。所以在查询的时候,当客户端上送包含查询语句的数据包传给服务器,如果查
询太大,服务端会拒绝接收更多的数据。而服务端响应数据给客户端通常数据很多,由多个数据包组成。一旦服务端
响应客户端请求,客户端必须完整的接收整个返回结果,不能只取前面的几条结果就让服务器中断传输,所以这也是
在必要的时候一定要在查询中加上limit限制的原因。


###(七)、在同一个表上查询与更新
MySQL不允许对同一张表同时进行查询和更新操作。例如
这里写图片描述
可以使用inner join方式或者给子查询定义一个别名 这里写图片描述
或者这里写图片描述
###(八)、关于查询缓存
MySQL查询缓存是默认开启的可以通过来查看是否开启

show variables like '%query_cache%'; 
  • 在打开查询缓存的时候会对服务器的读和写带来额外的消耗:
	1、读查询在开始之前必须检查是否命中缓存
	
	2、如果这个命中缓存,那么直接返回结果,如果这个查询没有被缓存并且可以被缓存,那么当完成执行后,
	MySQL会将结果存入缓存,这是存缓存带来的消耗
		
	3、当对数据表中写入数据的时候,MySQL必须对对应表中的缓存进行失效操作,如果查询缓存非常大或者存储
	缓存的碎片很多,会带来很大的系统消耗(无论写缓存还是失效操作,都是使用排它锁,这个消耗自然是不小的)。
  • 也不是所有的查询,MySQL都会缓存
   例如当查询语句中有一些不确定的数据时候,该查询就不会被缓存。如NOW(),CURRENT_DATE(),同时如果查询中
包含有用户自定义函数,存储函数,用户变量,临时表,mysql的系统表这些都不会被缓存。注意:某个查询结果会不会
被缓存跟某个查询会不会去缓存中检查是无关的。MySQL在检查缓存之前,通过一个大小写不敏感的检查来查看SQL语句
是不是以SEL开头。


  • 查询缓存的优化:
批量写入只需要做一次缓存失效,所以比单条写入效率更好。
		控制缓存空间的大小,缓存空间太大的话,在失效操作的时候会导致服务器僵死
		对于写密集的应用来说,禁用查询缓存更可能会提高系统的性能
		由于对互斥信号量的竞争,有时候直接关闭查询缓存对读密集型的应用也有好处。


*** 通过以上可以看出,使用查询缓存是一个非常方便的缓存,对应用程序完全透明,也无须额外的编码。但是对于一些高并发压力的环境下,希望有更高的缓存效率,可以利用一些其他替代方案来替换,推荐方案是在客户端实现缓存,具体有使用redis或者MongoDB来实现缓存。***

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查询性能优化的十条建议 的相关文章

  • 谈谈了解的几个专业

    本文涉及专业 智能科学与工程通信工程电子信息工程集成电路设计与集成系统微电子科学与工程计算机科学与技术电磁场与无线技术遥感科学与技术 这些学科专业 xff0c 很多之间是相互交叉的 以下仅作参考 xff01 xff01 xff01 随便聊聊
  • 深度学习平台框架

    简介 分类 模型转换 网络参数转到MAT 文件 keras权重到mat 可知直接用matlab读取hdf5文件 也可以通过如下脚本 keras2mat py 转换 span class token comment usr bin env p
  • Ubuntu16.04 + NVIDIA RTX3090 + Pytorch + Tensorflow

    文章目录 说明有用链接显卡驱动安装文件下载一次性安装显示驱动和cuda计算套件仅安装显示驱动仅安装cuda计算套件 安装Pytorch安装pytorch1 7源码安装pytorch1 8源码安装torchvision RTX3090性能问题
  • centOS jdk安装

    1 输入yum list installed grep java 可以查看CentOS自带的Java环境 2 卸载jdk yum y remove java 1 8 0 openjdk 输入yum y remove tzdata java
  • 元学习

    这里写自定义目录标题 说明比较好的资料文档代码 常用数据集介绍Omniglot 说明 比较好的资料 文档 torchmeta pytorch meta learning libraryPaper repro Deep Metalearnin
  • Markdown简明教程

    这里是目录 xff0c 输入 TOC 可以自动生成 文章目录 常用语法 一级标题 基本语法 二级标题 数学公式添加图片添加代码段 高级扩展语法插入classDiagram类图插入Mermaid流程图插入UML图插入甘特图 其它 常用语法 一
  • 深度神经网络中的卷积

    文章目录 卷积单元经典卷积运算经典二维卷积经典膨胀二维卷积运算经典二维转置卷积运算 实验分析实验说明实验结果 参考文献 卷积单元 本文给出了四维张量卷积的表达式 xff0c 卷积输出大小的表达式 xff0c 以及Matlab和PyTorch
  • 离线部署深度学习环境Ubuntu篇

    引言 不采用docker 以防拖慢速度 打算部署PyTorch Tensorflow 和 Keras框架 版本选择 如何选择系统 CUDA CUDNN Tensorflow Pytorch Keras等版本呢 首先看GPU 一些新的GPU卡
  • Visual Studio Code使用笔记

    文章目录 简介安装常用功能杂文件对比 常用插件通用快捷键文件头注释 C C 43 43 PythonLaTexMarkdown 其它C C 43 43 多文件编译运行代码运行 简介 与Sublime Text相比 xff0c vscode免
  • Matlab深度学习上手初探

    文章目录 简介实例网络设计代码运行结果 参考文献 简介 Matlab降低了深度神经网络的开发难度 xff0c 可以通过拖拽的模式设计网络 xff0c 甚至训练的过程也是GUI操作 实例 以高光谱图像分类为例 xff0c 参考文献1 构造一个
  • Julia学习笔记

    文章目录 简介安装与配置包的管理安装与删除包设置代理与更换镜像离线安装包 性能测试运行效率平稳性分析实验代码FFT加噪 实验结果Windows 10Ubuntu 16 04 LTS 其它资料 简介 Julia 是一个面向科学计算的高性能动态
  • Julia深度学习

    文章目录 Julia中的深度学习框架Flux性能对比LeNet5评估结果GPU CUDA 11 下的测试结果GPU CUDA 10 下的测试结果CPU单线程CPU多线程 18个线程 Matlab实现PyTorch实现Flux实现 MNIST
  • 常见评价指标

    文章目录 简介信息检索查准率查全率F measure虚警率漏检率 分类准确率混淆矩阵Kappa系数 简介 整理一些常见的评价指标 信息检索 信息检索是指从一些相关 relevant 和不相关 irrelevant 的信息中检索出相关信息 为
  • 免费拯救你误删的文件(Windows, Linux, Mac)

    简介 如果你的文件被误删了 别着急 做好如下准备 首先 不要往被删除文件所在的磁盘分区创建 复制新文件如果是Windows系统 那么你基本上可以在回收站里找到如果是Linux系统 如果是右击删除的 也可以到回收站里看看 但是如果是用 rm
  • TouchGFX使用心得(5)——标签的中文显示问题

    相信第一次接触ToughGFX的朋友 xff0c 可能会遇到 xff0c 标签的 中文显示是问号的问题 xff0c 这个问题在模拟器上运行的时候 xff0c 他是显示的问号 xff0c 但是在stm32运行的时候 xff0c 问号的地方不会
  • 编程语言效率对比

    目录 简介测试环境 矩阵乘法实验结果实验代码 简介 主要测试Matlab Python Julia 和C下的基本数学运算效率 测试环境 硬件测试环境 CPU Intel Xeon E5 2696 v3 2 30GHz 36内存 64 GiB
  • 基于深度学习的合成孔径雷达自聚焦

    文章目录 引言什么是合成孔径雷达什么是自聚焦 经典自聚焦方法基于机器学习的方法基于极速学习机的方法基于深度学习的SAR自聚焦 代码附录 引言 本文全面介绍合成孔径雷达自聚焦概念和方法 想获取更为详尽的描述 xff0c 请参考以下几篇论文 如
  • IEEE 论文排版之LaTeX模板

    说明 主要介绍IEEE LaTeX论文模板的使用 获取模板 IEEE的所有期刊 会议 杂志的模板都可以从 IEEE Template Selector 页面获得 xff0c 以期刊 IEEE Transactions on Geoscien
  • 基于 YOLOv2 Tiny的车牌检测

    文章目录 YOLO安装源码获取安装 车牌检测转换样本格式修改网络其它 训练可视化训练测试 YOLO安装 源码获取 从 darknet 下载 span class token function git span clone https git

随机推荐

  • docker 权限问题 Got permission denied while trying to connect to the Docker daemon socket at 。。。

    在用户权限下docker 命令需要 sudo 否则出现以下问题 通过将用户添加到docker用户组可以将sudo去掉 xff0c 命令如下 sudo groupadd docker 添加 docker 用户组 sudo gpasswd a
  • NAT模式,主机无法ping虚拟机,虚拟机可以ping主机

    原因 xff1a 虚拟机指定的虚拟网络和本机网络连接中的虚拟网卡未对应 xff0c 或网段不一致 解决 xff1a 在网络连接中找用于虚拟NAT网络下的虚拟网卡 xff08 我这里是VMnet2 xff0c 也有可能是VMnet8 xff0
  • zeromq 利用protobuf通信

    利用zeromq进行编程时候 xff0c 服务器和客户端的通信 xff0c 利用protobuf时候 之前的项目里面 xff0c 需要对protobuf进行编码解码 其实并不需要如此繁琐 xff0c 直接利用 protobuf里面的 Mes
  • 游戏升级之路

    七十一雾央原创 转载请注明 http blog csdn net hust xy 楼主学习编程有两年了 xff0c 决定向游戏发展大概就是半年前了 xff0c 在这里总结一下游戏方面的学习经历过 xff0c 给初学的朋友们参考下 xff0c
  • windows7远程桌面访问ubuntu16.04

    1 安装xrdp sudo apt get install xrdp xff12 安装vnc4server sudo apt get install vnc4server 3 安装xubuntu desktop sudo apt get i
  • <1> GCC的源码安装

    当我们安装好操作系统基本自带了gcc的编译器 由于版本和root 权限的问题 我们希望在自己的目录下创建一个相对独立的environment 这样我们更新起来也会比较方便 要安装基本gcc 首先要gmp mpfr和mpc xff08 ftp
  • TouchGFX使用心得(8)——通配符的中文显示(呕心沥血)

    这里写目录标题 前言方法一需要注意的问题 xff08 非常重要 xff01 xff01 xff01 xff01 xff09 方法二官方文档具体操作加载二进制文件通配符的显示放入stm32 总结 前言 通配符的中文的显示是我一直很疑惑的 xf
  • 9月10日美团网2014校招研发笔试哈尔滨站

    1 链表翻转 给出一个链表和一个数k xff0c 比如链表1 2 3 4 5 6 xff0c k 61 2 xff0c 则翻转后2 1 4 3 6 5 xff0c 若k 61 3 翻转后3 2 1 6 5 4 xff0c 若k 61 4 x
  • 2014校园招聘京东软件开发类笔试(完整版)

    时间 xff1a 2013 9 10 2013 10 8 地点 xff1a 四川大学 天津大学 职位 xff1a 软件开发工程师岗 语言 xff1a java 1 A 2 C 3 D 4 B 5 A 二 1 B 三1 D 2 B 3 C 4
  • 阅读科研文献心得分享(二)

    心得一 每天还保持读至少2 3篇的文献的习惯 读文献有不同的读法 但最重要的自己总结概括这篇文献到底说了什么 xff0c 否则就是白读 读的时候好像什么都明白 xff0c 一合上就什么都不知道 这是读文献的大忌 xff0c 既浪费时间 xf
  • 云数据库怎么挑选

    from http www chinacloud cn show aspx id 61 13222 amp cid 61 17 将数据库服务器在IaaS云上运行好吗 xff1f 或者应该转换成PaaS选择 xff1f 数据库即服务的选择可能
  • C# FTP操作(上传、下载等……)

    因为工作中经常涉及到FTP文件的上传和下载 xff0c 每次有这样的需求时都要重复编写相同的代码 xff0c 后来干脆整理一个FTPClass xff0c 这样不仅方便自己使用 xff0c 也可以共享给部门其它同事 xff0c 使用时直接调
  • 通过tasksel一键下载lamp(未成功)

    首先可以通过apt安装tasksel 安装 xff1a sudo apt install tasksel 通过taskel的方式安装lamp server全包 taskel的安装方式和apt get的有类似但是还是有区别个人觉得他像是apt
  • qemu创建快照后删除快照导致qemu crashed的BUG

    问题描述 启动一个虚拟机 创建三个快照 删除第一个快照时报错 合并磁盘失败 通过测试 创建虚拟机 ubuntu1604 win7 启动虚拟机 创建两个快照 删除第一个快照 瘦终端自自动关闭 vdsm报错如下 2018 07 20 17 00
  • 群晖docker容器内配置ubuntu远程桌面访问

    群晖docker容器内配置ubuntu远程桌面访问 当希望在群晖docker内的ubuntu开启远程桌面访问时 xff0c 和一般云服务器桌面安装方式还是有所区别 这里ubuntu的版本为14 04 LTS xff0c 由于nas性能较弱
  • Elasticsearch 7.6.0 最详细安装及配置(HA)安装与启动

    Elasticsearch 7 6 0 最详细安装及配置 xff08 HA xff09 安装与启动 Elasticsearch是一个非常好用的搜索引擎 xff0c 和Solr一样 xff0c 他们都是基于倒排索引的 今天我们就看一看Elas
  • python装饰器

    今天看了一些函数装饰器的知识 xff0c 第一遍没看懂 xff0c 后来才一点点弄明白 首先 xff0c 函数也是对象 xff0c 所以可以返回函数 def hello func func是函数名 def h xff1a 在函数内部的函数
  • 杀死XVNC进程

    0 重设密码 root 64 yqrh5u2 vncpasswd Password Verify root 64 yqrh5u2 1 xff0c 启动和kill vncserver root 64 yqrh5u2 vncserver 1 N
  • Winform布局与控件自适应分辨率以及防止错位

    我们在开发winform时 xff0c 在屏幕分辨率显示设置100 下开发系统界面 xff0c 但是有的同学的分辨率缩放设置是125 甚至 150 xff0c 这时候我们的系统界面默认就会错位 xff0c 导致效果体验极差 接下来我们来看效
  • 查询性能优化的十条建议

    三个原则 1 单行访问是很慢的 最好读取的块中能尽可能包含多的所需要的行 xff0c 使用索引可以创建位置引用以提升效率2 按顺序访问范围数据是很快的 lt 原因一 gt 顺序I O不需要多次磁盘寻道 xff0c 比随机I O要快很多 lt