mysql查询优化索引篇

news2024/11/17 17:23:29

     其实在写这篇文章之前,也对查询优化做过一些设置,但这次则更为具体一点,之前做的无非就是增加查询字段的索引,让select里和where里的内容全部都包含在索引内(覆盖索引不走回表的基本概念),但这次这么做的时候发现了一些问题,这也是我接下来要提到的,而且之前使用的是sqlserver的数据库做的优化,虽然数据量比较大,有1000W多条.但其实创建索引的部分则是我们领导建的,自己则是在查询语句和后台程序这块下功夫。而这次则是自己亲历亲为,接下来就开始展示这次项目的需求以及遇到的问题

    我们都知道想要检测一条查询语句能通过EXPLAIN关键字(具体语法请自行查阅)来判断是否可以优化,很显然,在优化之前的语句type类型为ALL,走的是全表扫描,也就是最慢的一个级别,所以我这次优先从这个地方开始下手,先把需要查询的字段全部加上索引:

ALTER TABLE 表名称 ADD INDEX 索引名称(字段1,字段2,字段3......);

      然后执行就报错了,原来是索引也是有范围限制的,之前查询的字段都是按照255长度来设置的,所以我还必须先把这些字段的长度给修改一下,对于那种固定的格式,比如状态,类型如果是用数字的话可以固定给1个长度,还有一些比如手机号,运单号等相对固定的格式,也可以给刚刚足够的长度即可.当我把长度全部重新设置了一遍:

ALTER TABLE 表名称
MODIFY COLUMN 字段1 VARCHAR(20),
MODIFY COLUMN 字段2  VARCHAR(5),
MODIFY COLUMN 字段3 VARCHAR(1);
......

      但修改完了发现还是报错,Too many key parts specified; max 16 parts allowed 通过查阅发现mysql的单个索引最多只能添加16个字段,但如果拆分的话 索引是失效的.打个比方你设置了索引1里有A,B,C这3个字段,然后又添加了一个索引2,里面增加了D,E,F这3个字段 然后你的查询语句如果是 select A,B,C,D from table 这种情况也是走的ALL全表,要么是select A,B,C from table 要么是select D,E,F from table 然后就是where的条件也要和select保持一致,如果你查询的是A,B,C 条件有D,E,F的话 索引也会失效.所以当时我这个查询有3个页面都用到了 之前是通过类别来查询不同的数据,现在则要根据类型做不同的查询条件了 因为如果全部放入到一个索引里是有限制的 

      于是我就创建了3个类型的索引,分别对应3个页面的查询列 这样一系列修改完了之后,再次执行之后级别就从之前的ALL提升到了INDEX了  如下图

      因为是联表查询,A表就是我查询的主要信息表,而B表则做了关联,同样也需要给B表的关联字段增加索引,不然B表的类型也是ALL级别.这样调整了之后 页面的整体速度有了明显的提升 感觉页面都没有刷新数据就发生了改变。然后执行搜索,第一次无缓存和第二次有缓存执行的效率如下图:

      最开始的时候是全字段查询,某些字段是text类型的,内容很多.非常的影响效率. 在第一次优化的时候就修改成点击操作的时候再触发事件通过主键ID获取那些庞大的内容.而没有优化之前是一次性查询出来,然后操作的时候把这个字段带入.现在的话改为不去查询那些列表里不展示的字段(除主键),并且过于大而长的字段也最好是再用户需要的时候再获取,类似于懒加载的思想.当时第一版优化完之后本地能把查询的速度从2秒提升到1秒,这次增加了索引之后则再一次把本地的查询效率提升到了新的台阶.

      最后总结下这次的收获,首先就是字段的长度大小,很多时候没感觉到有什么区别,只是概念上知道需要设置到刚好满足的长度即可,当然前提是这种字段是相对固定的格式,而不是全部的字段都按照同一个思想来做限制,这样弄反而会有问题,导致添加或者修改的时候程序报错,数据库字段长度不够.另外一个就是如果字段设置的太长了 比如之前设置的每个字段都是255的长度,那么建立一个索引 最多就只能添加3个255长度的字段,再添加就会报错,提示长度大小超出了限制

      另外一个则是让我知道了,并不是你建立了索引就能生效,比如上面我说到的那种情况,创建了2套索引  索引1为ABC,索引2为DEF  然后查询的时候既查询了索引1的内容,又查询了所引2的部分内容 这样则不会走索引的 .因为没有建立的索引没有覆盖住查询的内容.

      还有就是之前一直对联合索引和覆盖索引的概念比较模糊,现在通过例子  比如现在我建立了一个索引1ABC字段  又建立了另一个索引2DEF字段 

ALTER TABLE table ADD INDEX index1(A,B,C);

ALTER TABLE table ADD INDEX index2(D,E,F);
查询语句索引是否生效
select *  form table
select G from table
select A from table
select D from table
select A,B,C,D from table

查询的字段如果被某个索引全部命中则走索引,少于或者等于都行,大于则不行,比如D字段不在索引1里而ABC都在索引1里这样的也是不生效的

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

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

相关文章

Android 集成Bugly完成线上的异常Exception收集及处理

文章目录 (一)添加产品APP(二)集成SDK(三)参数配置权限混淆 (四)初始化 (一)添加产品APP 一)在个人头像 -> 我的头像 -> 新建产品 二&…

计算机组成原理(超详解!!) 第八节 总线系统

1.总线的概念和结构形态 1.总线(BUS)的基本概念 是构成计算机系统的互联机构,是多个系统功能部件(运算器、控制器、存储器、输入/输出设备)之间进行数据传送的公共通路。 由传输信息的电路和管理信息传输的协议组成…

【AI学习】对指令微调(instruction tuning)的理解

前面对微调(Fine-tuning)的学习中,提到指令微调。当时,不清楚何为指令微调,也一直没来得及仔细学习。 什么是指令微调?LLM经过预训练后,通过指令微调提升模型的指令遵循能力。所谓指令&#xf…

Sectigo SSL证书申请的流程是怎样的?

在当今数字化时代,网络安全成为了一个不可忽视的问题。为了保护网站和用户数据的安全,SSL证书成为了网站运营的重要组成部分。Sectigo作为全球领先的数字证书颁发机构之一,提供了一系列的证书解决方案来满足不同类型网站的需求。以下是对Sect…

浅谈Windows 上的线程亲和性(Thread affinity)

​ 前言 线程属性包括是否分离、亲和性、调度策略和优先级等。Linux默认的调度策略是CFS(完全公平调度算法),而 Windows 是基于优先级抢占式的策略。 在这些方面,Windows 和 Linux 差异巨大。本文仅针对 Windows 系统的线程亲和性进行探讨。 线程亲和性(Thread affinity) 什…

【大道至简】官方兼容到android13+的获取系统屏幕高度, statusbar,navBar

android在屏幕高度和app高度,statusbar, navigationbar的高度处理上,迭代了好多版本。 android11, android12都有新的api和过时的api标记。 涉及的api类似如下: windowManager,defaultDisplay, Context.display, Deco…

linux安装Openresty

安装必要的依赖库 指定仓库地址 下载openresty 添加环境变量 vi /etc/profile i export NGINX_HOME/usr/local/openresty/nginx/ export PATH${NGINX_HOME}/sbin:$PATH esc :wq source /etc/profile #启动 nginx # 重启 nginx -s reload #关闭 nginx -s stop

网上有哪些赚钱的方法能一天赚二三十?盘点7个靠谱的搞钱副业和赚钱软件

想在家里躺着就能把钱赚?这不再是遥不可及的梦想!随着互联网的飞速发展,网上赚钱的方式层出不穷,总有一款适合你。 今天,就让我们一起揭开这些神秘面纱,看看哪些网上赚钱秘诀能让你轻松实现月入过万&#x…

专业矢量绘图软件Sketch for mac v100中文激活版

Sketch for Mac 是一款专业的矢量图形设计工具,主要用于 UI/UX 设计、网页设计、图标设计等领域。它的界面简洁、易用,功能强大,可以帮助设计师快速创建高质量的设计作品。 Sketch for Mac 可以轻松地创建矢量图形、图标、网页布局、移动应用…

VACode 创建Vue项目完整过程

一、软件下载 VSCode官网下载地址:https://code.visualstudio.com/ 二、下载开发环境 1. 安装 [Node.js](https://nodejs.org/); 2. 安装 [npm](https://www.npmjs.com/) 依赖管理工具; 注:node.js安装完后会同步安装npm,一般…

数据结构之二叉树详解[1]

在前面我们介绍了堆和二叉树的基本概念后,本篇文章将带领大家深入学习链式二叉树。 1.预备知识 2.二叉树结点的创建 3.二叉树的遍历 3.1前序遍历 3.2中序遍历 3.3 后序遍历 4.统计二叉树的结点个数 5.二叉树叶子结点的个数 6.二叉树第k层的结点个数 7.总结 …

activiti——网关配置

文章目录 前言网关介绍代码案例测试各项网关排他网关 ExclusiveGateway1、绘制流程图2、编写测试代码 并行网关ParallelGateway1、绘制流程图2、编写测试代码 包含网关InclusiveGateway1、绘制流程图2、编写测试代码 前言 在activiti工作流中,还有一个组件也很重要…

短视频拍摄+直播间搭建视觉艺术实战课:手把手场景演绎 从0-1短视频-8节课

抖音短视频和直播间你是否遇到这些问题? 短视频是用手机拍还是相机拍?画面怎么拍都没有质感 短视频产量低,拍的素材可用率低 看到别人用手机就能把短视频拍好自己却无从下手 明明已经打了好几盏灯了,但是画面还是比较暗 直播软件参数不会设置,电脑…

Git使用(1):介绍、克隆、推送

一、介绍与安装 1、Git是什么? Git是目前世界上最先进的分布式版本控制系统。工作原理 / 流程: workspace:工作区Index / Stage:暂存区Repository:仓库区(或本地仓库)Remote:远程仓…

3dmax材质库导入方法?3dmax云渲染速度体验

3ds Max 材质库包含多种素材,如金属、木材、布料和石材等,但用户在导入材质时常遇到问题。本文将介绍如何在3ds Max中成功导入材质,并探讨使用云渲染服务来加速渲染过程,提高项目效率。 一、3dmax材质库导入教程 自建材质导入方法…

LLM Agent智能体综述(万字长文)

前言 🏆🏆🏆在上一篇文章中,我们介绍了如何部署MetaGPT到本地,获取OpenAI API Key并配置其开发环境,并通过一个开发小组的多Agent案例感受了智能体的强大,在本文中,我们将对AI Agent…

卷积神经网络CNN的运行过程、常见术语与问题

目录 一、CNN运行过程 1、卷积(Convolution) 2、激活函数(activation function) 3、池化(pooling) 3.1 池化操作 3.2 池化过程 3.3 池化后结果 4、Flatten 5、全连接层 Flatten层的操作 全连接层…

Oracle 流stream将删除的数据保存

Oracle 流stream将删除的数据保存 --实验的目的是捕获hr.employees表的删除行,将删除行插入到emp_del表中。 --设置初始化参数 AQ_TM_PROCESSES1 COMPATIBLE9.2.0 LOG_PARALLELISM1 --查看数据库的名称,我的为ora9,将以下的ora9全部替换为你的数据库名称…

部分树上问题及图的联通性(图论学习总结部分内容)

文章目录 前言三、部分树上问题及图的联通性最小生成树知识点例题 e g 1 : eg1: eg1: 走廊泼水节(克鲁斯卡尔思想的灵活运用) e g 2 : eg2: eg2: B-Picnic Planning e g 3 eg3 eg3:L - Classic Problem&…

Mybatis入门之在基于Springboot的框架下拿到MySQL中数据

介绍 Java技术操作数据库 MyBatis是一款优秀的持久层框架 用于简化JDBC的开发 优秀的持久层框架 我们要基于Springboot整合Mybatis 实操 学习 基于Mybatis是如何操作数据库的 通过MyBatis书写SQL语句 SQL语句执行完毕后 会将查询结果返回给Java程序 表中数据会自动封装…