MySQL调优系列(六)——查询优化

news2024/12/24 8:53:36

一、查询慢的原因

查询速率受网络、CPU、IO、上下文切换、系统调用、生成统计信息、锁等待时间等因素影响。
举个常见面试题:
一个表非常非常大,上亿级别的数据,性能会变慢嘛?如果表有索引
答:增删改会变慢。(索引也需要动态的修改,会降低 SQL 执行效率)。
查询不一定:如果特定的查询某一条数据或者少量数据,性能几乎没变化。如果并发查询大量数据,受带宽硬盘网络等影响,查询效率会变慢。

二、优化查询

查询的执行过程可以参考:MySQL调优系列(一)——性能监控。
查询时,首先是SQL命令传递到解析器的时候会被解析器验证和解析,分类/验证语义合法性。其次优化器会基于成本选择最有效的执行计划。

1、减少访问的数据量

举个栗子:分页优化
查询语句如下:

explain  select * from suoyin_test  limit 30000,1;

explain  select * from suoyin_test a join (select id from suoyin_test limit 30000,1) b on a.id = b.id;

运行结果如下:
在这里插入图片描述
在这里插入图片描述
优化的主要思路:
先利用覆盖索引把要取的数据行的主键取到,然后再用这个主键列与数据表做关联(查询的数据量小了后再进行查询)。

2、减少不必要的数据筛选

(1)尽量根据需要返回列,不要返回全部列,比如用limit取值。
(2)多次取用相同的数据,可以使用缓存。

3、优化器的优化类型

(1)重新定义关联表的顺序。数据表的关联并不总是按照在查询中指定的顺序进行,决定关联顺序时优化器很重要的功能。
(2)将外连接转化成内连接,内连接的效率要高于外连接。
(3)使用等价变换规则,mysql可以使用一些等价变化来简化并规划表达式。
优化count、min、max等聚合函数。索引的列是否可以为空通常可以帮助mysql优化这类表达式:例如,要找到某一列的最小值,只需要查询索引的最左端的记录即可,不需要全文扫描比较。
(4)子查询优化。mysql在某些情况下可以将子查询转换一种效率更高的形式,从而减少多个查询多次对数据进行访问,例如将经常查询的数据放入到缓存中。
(5)等值传播(自动等值)。比如关联查询时,两个表的共性属性做筛选条件,只需要写一个就行。

4、关联查询

如果被驱动表加索引,效率是非常高的,但如果索引不是主键索引,所以还得进行一次回表查询。相比,被驱动表的索引是主键索引,效率会更高。具体参考:MySQL调优系列(五)——索引详解。

5、排序优化

(1)使用索引扫描来做排序。 创建组合索引的时候默认的索引排序是升序,所以后续用组合索引列进行排序要全部升序或者全部降序才会用到索引。
(2)未使用到索引排序。 分双次排序和单次排序。
双次排序 :两次扫描磁盘,最终得到数据。第一次数据读取是将需要排序的字段读取出来,然后进行排序,第二次是将排好序的结果按照需要去读取数据行。(多次随机IO,读取数据成本会比较高。)
单次排序:从磁盘读取查询需要的所有列,对它们进行排序,然后扫描排序后的列表进行输出。(效率更高,避免二次读取,把随机IO变成了顺序IO,但是对内存要空间要求高,无法存储大量的数据。)
优化策略:

① 增大 sort_buffer_size参数的设置(单路排序的内存大小)
② 增大 max_length_for_sort_data参数的设置(单次排序字段大小)
③ 去掉select 后面不需要的字段

6、count查询优化

count(*)、count(1)、count(id)查询速度大差不差。

7、分组优化

实质是先排序后分组,所以优化策略和排序优化一样:能使用索引尽量使用索引,不行的话就尽量增大sort_buffer_size,优化成单次排序。

8、子查询优化

尽量使用关联查询,inner join。

9、去重查询

尽量不要使用 distinct 关键字去重,可以使用分组(group by),可以用到索引。

三、总结

补充一句总结:能用索引就用索引!

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

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

相关文章

Python可视化分析项目高分课设

今天给大家分享一个基于python的django框架结合爬虫以及数据可视化和数据库的项目,该项目总体来说还是挺不错的,下面针对这个项目做具体介绍。 1:项目涉及技术: 项目后端语言:python 项目页面布局展现:前…

数据结构--队列

文章目录 队列基础队列的实现链表实现环形数组实现tail一直加的问题容量处理 队列的使用 队列基础 queue 是以顺序的方式维护的一组数据集合 相对于链表来说,队列操作数据的位置是固定的只能2端操作。 在一端添加数据,从另一端移除数据。习惯来说&#…

高完整性系统(3):Threat Modelling

文章目录 基础安全性质保密性(Confidentiality)完整性(Integrity)可用性(Availability)认证(Authentication)不可抵赖性(Non-repudiation)访问控制&#xff0…

从开源软件看动态内存分配

动态内存分配 我们通常在C里面动态分配内存,会写出下面这样的代码: struct header {size_t len;unsigned char *data; }; 随后为data malloc一段内存出来,那么还有其他办法吗? 那便是弹性数组!在阐述本节之前&#xff…

数据安全有隐患?金仓数据60秒邀你闯关破题赢奖品

数字时代 数据成为宝贵资产 数据的安全 更是关乎行业可持续发展 关乎社会的稳定和国家战略 数据库作为 数据安全的首要防线 如何纵深防御 保障数据安全合规 满足新应用新场景下的安全防护要求 金仓数据60秒 发布多个视频为您详细剖析 同时,小编发起“闯关挑战”活动…

【Linux】14. 文件缓冲区

1. 文件缓冲区的引出 如上现象,在学习完文件缓冲区之后即可解释 2. 认识缓冲区 缓冲区的本质就是内存当中的一部分,那么是谁向内存申请的? 是属于谁的? 为什么要存在缓冲区呢? 道理是如此,在之前的学习过…

基于matlab仿真带有飞机的虚拟场景

一、前言 此示例演示如何通过 MATLAB接口使用空间鼠标。 开始此示例后,带有飞机的虚拟场景将显示在 Simulink 3D 动画查看器中。您可以使用空格鼠标在场景中导航平面。通过按下设备按钮 1,您可以在当前平面位置放置标记。 此示例需要空间鼠标或其他兼容设…

Neuralangelo AI - 视频生成3D模型

NVIDIA Research 宣布了 Neuralangelo,这是一种创新的 AI 模型,它利用神经网络的力量从 2D 视频剪辑中重建详细的 3D 结构。 Neuralangelo 能够生成逼真的建筑物、雕塑和其他现实世界物体的虚拟复制品,展示了 AI 在 3D 重建领域的非凡潜力。…

十个国内可用的智能AI模型

AI语言模型,就是一种利用机器学习和自然语言处理技术进行文本生成的算法。其基于大量已有的语料库进行训练,建立出一个能够理解自然语言规律和特征的语言模型。对于输入的文本、任务和目标,AI语言模型可以快速生成对应的结果。 在实际应用中&…

Flume入门监控端口数据官方案例

Flume安装部署 相关地址 Flume官网地址:http://flume.apache.org/文档查看地址:http://flume.apache.org/FlumeUserGuide.html下载地址:http://archive.apache.org/dist/flume/ 安装 将apache-flume-1.9.0-bin.tar.gz上传到linux的/opt/s…

责任链模式的学习与使用

1、责任链模式的学习 责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,它允许你将请求沿着处理链进行传递,直到有一个处理者能够处理该请求。责任链模式将请求的发送者和接收者解耦,使多个对象都有机…

计算机网络通信过程

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和…

案例|某城商行Zabbix 监控架构分享

编者荐语: 东莞银行董天保将出席7月份Zabbix大会分享案例经验,欢迎参加! 以下文章来源于有田菜也香 ,作者AcidGo 东莞银行董天保先生将于7月份参加Zabbix大会分享使用经验,欢迎扫码参加! 【导读】某银行…

openCV(三)绘制几何图形

openCV内置了几何图形绘制函数,通过简单的操作就可以绘制几何图形。例如,可以绘制直线、矩形、圆形、椭圆、多边形、文字等,分别对应函数cv2.line()、cv2.rectangle()、cv2.circle()、cv2.ellipse()、cv2.polylines()、cv2.putText()。 下面来…

Mysql进阶【3】论述Mysql优化

1.通过explain查看sql的详细信息 Mysql的sql优化企业里边主要是对慢sql进行优化,对语句进行优化,对索引进行优化 通过explain查看sql的详细信息,并且分析sql语句存在的问题,比如有没有使用到索引、使用了索引还是慢是不是索引设…

第一章_从减库存聊起

在多线程高并发场景下,为了保证资源的线程安全问题, jdk 为我们提供了 synchronized 关键字和 ReentrantLock 可重入锁,但是它们只能保证一个 jvm 内的线程安全。在分布式集群、微服务、云原生横行的当下,如何保证不同进程、不同…

2023年京东618预售数据:传统滋补成预售黑马,预售额超27亿

这一期主要分享一下此次京东618预售期间的一个黑马行业——传统滋补。不管是从预售量和预售额来看,传统滋补品类的成绩都是此次大促中的佼佼者。 究其原因,近几年养生滋补也掀起了一股“国潮风”。在小红书、抖音等社交平台上,关于“健康养生…

车载摄像头专用——拓尔微低功耗超高集成PMIC TMI7205B

“2023将是汽车行业的大变革之年,全球迎来L2向L3/L4跨越窗口。”越高级别的自驾对周围环境感知要求越高,车载摄像头“高清化”势不可挡,目前已从传统的100万直接跃升至800万像素摄像头,甚至在供应层面,已有超1500万高像…

Vue.js 中的 $forceUpdate 方法是什么?有什么作用?

Vue.js 中的 $forceUpdate 方法是什么?有什么作用? 在 Vue.js 中,$forceUpdate 方法是一个很常见的方法之一。它可以强制组件重新渲染,从而让组件的视图更新。本文将介绍 $forceUpdate 方法的使用方法和作用,并给出一…

代码随想录算法训练营第二天| 977.有序数组的平方 209.长度最小的子数组 59.螺旋矩阵||

LeetCode977.有序数组的平方 链接:有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 看到这道题,我第一反应就是把每个数的平方算出来然后排序&#xff…