mysql查询优化索引篇

     其实在写这篇文章之前,也对查询优化做过一些设置,但这次则更为具体一点,之前做的无非就是增加查询字段的索引,让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.hqwc.cn/news/700600.html

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

相关文章

全网最通俗易懂的vue透传

概念: Vue的透传是指在Vue组件中,使用特定的语法将父组件传递的属性或事件直接传递给子组件,实现了通过父组件传递数据或事件,再传递给子组件的功能。(传递给一个组件,却没有被该组件声明为 props 或 emit…

【Javaer学习Python】 1、Django安装

安装 Python 和 PyCharm 的方法就略过了,附一个有效激活PyCharm的链接:https://www.quanxiaoha.com/pycharm-pojie/pycharm-pojie-20241.html 1、安装Django # 安装Django pip install Django# 查看当前版本 python -m django --version 5.0.62、创建项…

c++多态机制

多态 在 C 中,多态(Polymorphism)是一种面向对象编程的重要概念,它允许不同类的对象对同一消息做出不同的响应。具体来说,多态性允许基类的指针或引用在运行时指向派生类的对象,并且根据对象的实际类型来调…

算法_前缀和

DP34 【模板】前缀和 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别int n in.nextInt(),q in.ne…

Hadoop 3.4.0+HBase2.5.8+ZooKeeper3.8.4+Hive+Sqoop 分布式高可用集群部署安装 大数据系列二

创建服务器,参考 虚拟机创建服务器 节点名字节点IP系统版本master11192.168.50.11centos 8.5slave12192.168.50.12centos 8.5slave13192.168.50.13centos 8.5 1 下载组件 Hadoop:官网地址 Hbase:官网地址 ZooKeeper:官网下载 Hive:官网下载 Sqoop:官网下载 为方便同学…

一文带你快速了解GPT-4o!内含免费使用指南!

一、GPT-4o简介 北京时间5月14日,OpenAI举行春季发布会。OpenAI在活动中发布了新旗舰模型“GPT-4o”!据OpenAI首席技术官穆里穆拉蒂(Muri Murati)介绍,GPT-4o在继承GPT-4强大智能的同时,进一步提升了文本、…

深入理解K8S【安全认证机制kubectlconfig】

深入理解K8S【安全认证机制】 1 核心概念 1.1 安全体系 对于大型系统来说,对业务的权限、网络的安全认证是必不可少的。 对于linux系统来说,用户和组、文件权限、SELinux、防火墙、pam、sudo等,究其核心的目的都是为了保证系统是安全的。 …

LeetCode1657确定两个字符串是否接近

题目描述 如果可以使用以下操作从一个字符串得到另一个字符串,则认为两个字符串 接近 : 操作 1:交换任意两个 现有 字符。例如,abcde -> aecdb操作 2:将一个 现有 字符的每次出现转换为另一个 现有 字符&#xff0…

【计算机毕业设计】ssm绿色农产品推广应用网站

21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的 重要性已逐渐被人们所认识,科学化的管理,使信息存储达到…

分布式系统的一致性与共识算法(二)

Consitency 背景 如买最后一张车票,两个售票处分别通过某种方式确认过这张票的存在。这时,两家售票处几乎同时分别来了一个乘客要买这张票,从各自"观察"看来,自己一方的乘客都是先到的,这种情况下&#xf…

Docker常用镜像安装

1. mysql 1.1 安装 获取镜像 docker pull mysql:8.0.30创建文件挂载目录 创建容器并运行 docker run -p 3306:3306 --name mysql8 \ -v /home/docker/mysql8/log:/var/log/mysql \ -v /home/docker/mysql8/data:/var/lib/mysql \ -v /home/docker/mysql8/mysql-files:/va…

<网络安全>《83 微课堂<国家数据要素总体框架>》

1 总体框架 国家数据要素化总体框架由“六横两纵”共八个关键环节构成。 2 国家数据基础设施(NDI) 最底部第一层是国家数据基础设施(NDI)。国家数据基础设施(NDI)是经济社会进入数据要素化发展新阶段后新…