Mysql 索引优化

Mysql 索引优化

mysql如何选择使用索引。

select *from user where username = 'a' and password = 'b'

如果useranme和password都是普通索引,那么他们会把2个索引都查出来,然后在把他们的交集拿出来

如果username是唯一索引,password是普通索引,那么我们的mysql就会优先使用唯一索引

select * from user where a > 2 and b =3

a和b都是索引,而且还是联合索引

这个时候索引b会失效,因为使用索引a然后在通过回表找里面的b是否等于3

因为联合索引的机制是先从做到有,这个操作在a索引中,他收到的任务是找到所有>2的数据,当大于2的数据都找出来了,那么此时的B是无序的,所以就导致了索引失效,索引不失效的前提的是索引必须保持有序。

虽然会索引失效,但是在Mysql新版本会使用索引下推的优化

  1. 索引扫描: 数据库引擎使用联合索引(a, b)扫描满足 a > 1 条件的记录。
  2. 条件判断: 在索引扫描的同时,对于每一条记录,会判断是否满足 b = 2 的条件。这个判断是在索引的层面上完成的,而不需要回表。
  3. 结果集形成: 只有同时满足 a > 1 和 b = 2 的记录会被放入结果集。
  4. 返回结果: 最终的结果集包含了同时满足 a 和 b 条件的记录,而这些记录是在索引扫描的过程中完成条件判断的。
select * from user a >= 2 and b = 3

这时候a和b索引就不会失效,因为a收到的命令是找到>=2的数据,当找到了2以后,然后就去看b,在2内的b索引是有序的,所以这时候b的索引是可以生效的。

ELECT * FROM t_table WHERE a BETWEEN 2 AND 8 AND b = 2

这个是和我们>= 是一样的,<=一样的不会导致我们的2个索引失效。不同的数据库会有差异,Mysql是这样的

SELECT * FROM t_user WHERE name like 'j%' and age = 22

name和age他们也是联合索引。首先会找到所有j开头的单词,然后,在挨个判断age是否等于22,也就是age索引会失效。

如果他们都是普通索引,那么mysql会根据索引的复杂度或者索引的大小,唯一值值数量 和 选择性(如j开头的数据比较少) 和索引长度大小(比如值int就是4个字节,varchar(20)就是20个字节)等去选择一个合适的索引去使用

Mysql在使用> <范围查询的时候会导致索引失效,但是在使用前缀匹配的范围不会失效如<= >= betwwen like等

什么时候使用索引

字段有一些唯一性,比如username,需要使用where快速定位的。经常用group by和order by的,因为索引都是排序好的就不需要在排序一次了。

什么字段不需要索引

where 和group by、 order by用不到的字段,因为索引的价值是快速定位。

当字段有大量重复内容是不需要加索引的。Mysql有一个优化,如果一个字段的内容重复率比较高,那么就会全表扫描。

经常更新的字段不需要建立索引

表数据太少的时候不需要建立索引。

合理的使用联合索引

select * from order where status = 1 order by create_time desc

这种情况要给status和create_time建立一个联合索引,这样只用到status索引还要对我们的time排序,这样就会using filesoft,这样根据status筛选出来的就是按照time排好序的,避免了在文件排序

索引的优化方案

前缀索引优化方案

​ 使用某个字段的前几个字符建立索引,优点就是减少索引大小,比较适合大字段作为索引的情况,缺点是group by无法利用这个前置索引,无法把前置索引作为覆盖索引。

覆盖索引优化

​ 就是我们要查出来的内容就是我们的索引的内容,比如我们联合查询(a,b,c)然后我们

select a,b,c from tables where a =12

这个时候我们就避免了一个回表找内存的操作,叶子节点直接找到了我们想要的数据。

主键最好是自增

如果我们主键是自增,每次插入数据都是追加操作,不需要重新移动数据。

如果非自增主键,我们每次插入的位置是不确定, 可能被插入了某个数据页的中间,这就不得不从启动其他数据到别的页来满足这个插入需求了,会导致页分裂,页分裂可能会导致大量的内存碎片,导致索引结构不紧密,影响查询效率。

比如当前有一个页[1,2,4,5],这时候我们要插一个3这时候就可能[1,2,null,null,null],[3,4,5,null,null] 导致了页分裂

索引设置NOT NULL

第一个原因,因为如果索引列为NULL,会导致优化器使用索引的时候更加复杂,更加难优化。因为NULL会列会使索引、索引统计和值比较都比较困难。在使用索引统计个数的时候,如果为null,会不作为个数相加。比较困难因为在null在sql中都是unkwon的。

tip:NULL一共有3种状态,真、假和未知

key_len

Key_len只是告诉你索引查询使用了哪些字段,而不是这个字段具体占了多少字节空间

索引执行计划参数 explain分析

  • possible_keys 字段表示可能用到的索引;
  • key 字段表示实际用的索引,如果这一项为 NULL,说明没有使用索引;
  • key_len 表示索引的长度;
  • rows 表示扫描的数据行数。
  • type 表示数据扫描类型,我们需要重点看这个。

其中的type

all是全表扫描

index是全索引扫描

range是索引范围扫描

ref是非唯一索引

eq_ref是唯一索引扫描

const 只有一条扫描索引,或者唯一扫描索引

为什么innodb选择B+Tree作为索引数据结构

B+Tree的叶子结点用双向链表连接起来,适合范围查找(B Tree无法做到这点)

B+Tree的高度很低,及时在千万级别的数据量下,依然维持到3-4层,也就是说一次查询只需要做3-4次io就可以找到目标数据

什么时候索引会失效

使用左模糊%xx 或者左右模糊%xx%

使用计算、函数、类型转换。

使用or

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

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

相关文章

探究React中的非受控组件:自由而简便的表单处理

探究React中的非受控组件&#xff1a;自由而简便的表单处理 在React中&#xff0c;我们常听到"受控组件"的概念&#xff0c;但同样存在一种自由度更高、处理简便的形式——非受控组件。本文将深入介绍非受控组件的使用&#xff0c;通过代码片段中的登录表单实例&…

Java 面试题之 IO(二)

字符流 文章目录 字符流Reader&#xff08;字符输入流&#xff09;Writer&#xff08;字符输出流&#xff09; 文章来自Java Guide 用于学习如有侵权&#xff0c;立即删除 不管是文件读写还是网络发送接收&#xff0c;信息的最小存储单元都是字节。 那为什么 I/O 流操作要分为字…

状态管理与导航守卫

为什么要用vuex&#xff1f; 进行统一的状态管理&#xff0c;解决不同组件共享数据的问题。 如何使用vuex&#xff1f; 1.安装引入 npm install vuex --save 2.注册到vue中 import Vue from vue import Vuex from vuexVue.use(Vuex)3.实例化vuex的store export default new Vue…

算法训练营总结

目录 收获思考感悟后续 收获 不知不觉&#xff0c;已经跟着训练营刷了两个月的题。 之前也跟着代码随想录刷了一大半&#xff0c;因为出差中断没有坚持下来&#xff0c;仅有的基础也扔下了不少。 而这两个月跟着训练营最大的收获就是坚持&#xff0c;不会的题硬啃几天也要搞…

Java 与 JavaScript的区别

Java 与 JavaScript的区别 Java 与 JavaScript&#xff1a;概述Java的特点JavaScript 的起源JavaScript 的特点Java 与 JavaScript&#xff0c;哪个更好&#xff1f;JavaScript 与 Java 相似吗&#xff1f;Java 与 JavaScript 的区别JavaScript 在服务器端的运行方式是怎样的&a…

网络防御安全知识(第二版)

安全策略 传统的包过滤防火墙 --- 其本质为ACL列表&#xff0c;根据数据报中的特征进行过滤&#xff0c;之后对比规制&#xff0c; 执行动作。 五元组 --- 源IP&#xff0c; 目标IP&#xff0c;源端口&#xff0c; 目标端口&#xff0c;协议 安全策略 --- 相较于ACL的改进之…

网站打不开怎么办?高防IP弹性防护更省心

不管你是什么网站&#xff0c;商城网站、游戏网站或者支付网站都有可能存在被攻击的情况&#xff0c;超过防护就会被打死&#xff0c;网站随即而来就打不开了。网站打不开怎么办&#xff1f;看看是不是网站主机或者服务器被攻击了。攻击的大小不可控&#xff0c;选择高防服务器…

Linux/Delivery

Enumeration nmap 首先扫描目标端口对外开放情况&#xff0c;第一轮扫描发现对外开放了22,80,8065三个端口&#xff0c;端口详细信息如下 nmap -sC -sV -p 22,80,8065 10.10.10.222 nmap显示22端口运行着ssh服务&#xff0c;80端口运行着http服务&#xff0c;8065端口运行的…

微信小程序 如何调用微信支付接口

前提&#xff1a; 小程序为企业小程序 并开通了 微信打款认证 例子&#x1f330;&#xff1a; 我们这里以订单为例子 1.创建订单 朝后端发送订单id 或信息 2.后端生成 时间戳/随机字符/id/后端算法签名 3.将获取到的数据 塞入 wx.requestPayment然后就可以掉起为微信支付…

基于go mod模式创建项目最佳实践

希望能带给你成功的喜悦&#xff01; 除go get、vendor这两种方式外&#xff0c;Go版本在1.11之后推出了go module模式来管理依赖&#xff0c;使用go mod时下载的依赖文件在$GOPATH/pkg/mod/下。本文以两种办法介绍如何创建go mod项目。 目录 goland开启玩法 本地手动创建项目…

【Linux】Linux下多线程

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 1. 前置&#xff1a;进程地址空间和页表1.1 如何看待进程地址空间和页表1.2 虚拟地址…

MIAOYUN获评OpenCloudOS社区2023年度优秀贡献企业

近日&#xff0c;OpenCloudOS社区发布了社区年度贡献企业榜单&#xff0c;成都元来云志科技有限公司&#xff08;简称“MIAOYUN”&#xff09;凭借对国产开源的热情&#xff0c;及对操作系统产业的支持&#xff0c;通过兼容适配互认证&#xff0c;为推动OpenCloudOS规模化应用&…

python数据类型-数字类型

1. 整型 整型即整数类型&#xff0c;对应于python中的int类型&#xff0c;包含&#xff1a;0&#xff0c;正整数&#xff0c;负整数 数字前面加上进制修饰符代表该数字是几进制&#xff0c;如0b1010则代表二进制&#xff0c;其输出结果为十进制10。默认不加任何进制修饰符为十…

使用IP爬虫代理提取数据的步骤是什么?爬虫代理IP怎么提高采集效率?

​​​​​ 一、使用IP爬虫代理提取数据的步骤 在使用爬虫代理IP提取数据之前&#xff0c;需要先了解数据来源和目标网站的结构。以下是一个基本的步骤&#xff1a;1.确定数据来源 首先需要确定要提取数据的网站或数据源&#xff0c;了解网站的结构、数据存储方式以及数据更新…

Qt应用软件【协议篇】Modbus详细介绍

文章目录 概述Modbus 485协议概述在工业自动化中的应用 通信模式数据模型功能码 Modbus RTU示例 1&#xff1a;读取保持寄存器示例 2&#xff1a;写入单个线圈示例 3&#xff1a;写入多个保持寄存器报文传输 Modbus ASCII报文示例报文传输 Modbus TCP报文示例报文传输 概述 在…

如何将iPad连接到USB设备?这里提供了详细步骤

本文介绍了如何将iPad连接到USB设备。说明适用于所有版本的iPad。 将USB设备与带USB-C端口的iPad一起使用 以下iPad具有USB-C端口: 自2018年第三代以来的iPad Pro机型 自2020年第四代以来的iPad Air机型 自2021年第六代以来的iPad迷你机型 自2022年以来的第十代iPad机型 这些…

PINN物理信息网络 | 混合变量PINN求解纳维-斯托克斯方程

混合变量物理神经网络(Mixed Variable Physics-Informed Neural Network,PINN)是一种将物理知识与神经网络相结合的方法,用于求解偏微分方程(Partial Differential Equations,PDEs)的数值解。纳维-斯托克斯方程是一种描述流体运动的PDE,可以通过混合变量PINN方法进行求…

nltk关键字抽取与轻量级搜索引擎(Whoosh, ElasticSearcher)

背景 有时候你想用一句完整的话或一个文本在基于关键字的搜索引擎里搜索&#xff0c;但是如果把整个文本放进去搜索的话&#xff0c;效果不是很好&#xff0c;因为你的搜索引擎是基于关键字而不是sematic search。那怎么抽取关键字呢&#xff1f; 利用NLTK抽取关键的代码 imp…

动手学深度学习(一)深度学习介绍2

目录 二、起源 三、深度学习的成功案例&#xff1a; 四、特点&#xff1a; 五、小结&#xff1a; 二、起源 为了解决各种各样的机器学习问题&#xff0c;深度学习提供了强大的工具。 虽然许多深度学习方法都是最近才有重大突破&#xff0c;但使用数据和神经网络编程的核心思…