Mysql索引解析

索引

1.创建索引的SQL

ALTER TABLE tbl_name ADD PRIMARY KEY (col_list);
// 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
ALTER TABLE tbl_name ADD UNIQUE index_name (col_list);
// 这条语句创建索引的值必须是唯一的。
ALTER TABLE tbl_name ADD INDEX index_name (col_list);
// 添加普通索引,索引值可出现多次。

2.默认方式创建索引innodb

在这里插入图片描述

3.聚集索引和非聚集索引

聚集索引:索引和数据存储在一起。在innodb存储引擎中数据和索引都存在ibd文件中。

在这里插入图片描述
非聚集索引:索引和数据存储在不同的地方,例如:MyISAM存储引擎将索引存在MYI文件,将数据存在MYD文件中。

1.面试:为什么innodb表要建主键索引,并且推荐主键是整型自增的。

二级索引要回表,找主键,通过主键再去定位数据。整型自增为什么??B+树遍历时整型自增比大小效率高。

uuid效率低。uuid相比占用空间大。使用自增主键插入元素效率比较高,B+树底层直接往后插,不会因为占用内存大而分裂。

4.最左前缀原则

联合索引要符合最左前缀原则。比如只对a\b\c三个字段建立联合索引,写SQL时where要写a字段的条件。

为什么要这样?生成B+树时,会依次比较各个联合索引,第一个相同再比较第二个。不提供第一个索引条件会导致索引失效。

5.索引失效的情况

  • 不满足最左前缀原则:因为联合索引的情况下,数据是按照索引第一列进行排序,第一列相同才会按照第二列排序。
  • select * :把*改成索引字段(覆盖索引)
  • order by:select 索引a,非索引字段 from 表 order by xx 。这个时候会索引失效,因为索引字段和非索引字段不在一个索引列中,需要回表。解决,通过子查询查出id然后手动回表。
  • sql中有运算、函数:因为对索引列进行了重新计算
  • where条件,写错类型 varchar不带引号。int带着引号,会走索引。
  • like左边包含了百分号
  • 列对比导致索引失效,使用覆盖索引
  • 使用or关键字,mysql8中需要or两边都建立索引

6.常问的索引类型

(1)二级索引

在这里插入图片描述

(2)覆盖索引

select id from product where product_no = '0002';

当通过二级索引就能找到不需要回表,这就叫做覆盖索引。

(3)前缀索引

前缀索引是指对字符类型字段的前几个字符建立的索引,而不是在整个字段上建立的索引。

(4)联合索引

通过将多个字段组合成一个索引,该索引就被称为联合索引。

7.什么时候(不)适合建立索引

  • 需要建立:

字段唯一,比如商品编码。

经常用于where查询的字段,可以快速定位并且不需要回表。

经常用于order by和group by的字段。

  • 不需要建立:

    字段中有大量的重复字段,这样B+树分叉就很少,比如性别。

表数据太少,不需要建立索引。

经常更新的字段不要建立索引,维护成本大。

where、group by ,order by用不到的字段,起不到定位作用。

8.B+树的生成过程

  • mysql底层会对插入的数据进行分组,会把每个组中最小的索引放在页目录当中。页目录和数据组成了页,默认大小是16KB。很多页形成双向链表。

  • 为所有的数据页生成一个索引页,索引页中存放每页最小的索引。每个索引有一个指针,指向数据页。

  • 根据索引页—>数据页---->数据页目录---->所在分组----->定位数据

9.为什么索引采用B(+)树

为什么不用二叉树:对于自增的数据索引,二叉树会退化成链表。使用索引查找还是需要全表扫描。

为什么不用红黑树:当数据量大的时候,高度不可控

B树:横向存储的元素多,高度低

B+树:所有的数据放在叶子结点,中间的非叶子结点是冗余的索引元素。叶子结点用指针连接。每个结点16KB,bigint8字节,索引6个字节。三层的索引B+树,可以存放三千万条数据(每条数据按照1KB算,索引按bingint类型计算、索引按6字节计算)。磁盘io少。对于mysql高版本,索引会被存放在内存,磁盘io一次。

10.索引优化

  • 建立前缀索引,order by无法使用前缀索引
  • 覆盖索引,所写SQL需要的字段是包含在二级索引的叶子节点的,不需要回表
  • 主键递增,不然插入的时候会发生页分裂
  • 索引设置成not null 否则优化器在索引选择时更复杂
  • 防止索引失效

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

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

相关文章

加入到「圆心学堂」知识星球后,你将获得些什么呢?

大家好呀,我的知识星球上线啦!加入到「圆心学堂」知识星球后,您将获得些什么呢? 1.共50套原创精品图文教程电子书,包含1000篇文章,涵盖主流框架、中间件、分布式和微服务等领域,紧跟行业趋势&a…

怎么培养政府机关的公文写作能力?

AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量 公文写作千万不能零起步,你有时间慢慢学习,但领导哪有时间等你慢慢进步啊。 如果问写公文有什么捷径,那就不得不靠「AI写作工具…

XLua 原理分析 三

前面已经介绍了Lua与C#的基础通信原理,和Wrap中间文件的作用。有了前面2篇的基础,大概已经能搞清这块的原理。 为了加深对这块的印象,这里开始正式分析Xlua中的Lua和C#的通信。 一、Lua如何调用CS的过程 lua的初始化代码: pri…

python基础巩固

基本数据类型 可以用isinstance来判断 a111 isinstance(a,int) True数值运算: >>> 2 / 4 # 除法,得到一个浮点数 0.5 >>> 2 // 4 # 除法,得到一个整数 0 >>> 17 % 3 # 取余 2Python 字符串不能被改变。向一个…

vuex学习day02-state状态、严格模式(strict)、mutations、辅助函数mapMutations、actions

4、state状态 (1)作用:提供共享数据 (2)步骤: 1)找到仓库,通过state提供共享数据 报错1?: 解决方式: 找到.eslintrc.js文件,添加一…

LabVIEW操作系列1

系列文章目录 我的记录: LabVIEW操作系列 文章目录 系列文章目录前言五、特殊用法5.1 取值范围表示5.2 对输入值取值范围进行限定5.3 控制多个While循环停止运行。5.4 获取按钮上的文本5.5 获取按钮上的文本【进阶】 六、使用步骤1.引入库2.读入数据 七、其余功能7.…

python+barcode快速生成条形码3-PyQt6微界面(电商条形码生成工具)

背景 继续上一片文章的电商测试小工具,进行了优化 需求 生成条形码之后,可以通过界面方式读取条形码的图片 支持当个条形码快速生成,以及批量导入 csv文件导入 添加微界面图像按钮,方便操作,更像是在实现测试工具的…

AI在Facebook的应用:预见智能化社交的新前景

在数字化时代,社交媒体平台已成为我们生活的重要组成部分,而人工智能(AI)的快速发展正推动着这些平台向更智能、更个性化的方向发展。Facebook,作为全球最大的社交网络平台之一,正不断探索和应用AI技术&…

基于JAVA+SpringBoot+Vue的oa系统

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 技术范围:SpringBoot、Vue、SSM、HLMT、Jsp、SpringCloud、Layui、Echarts图表、Nodejs、爬…

x64dbg反汇编技术入门学习笔记

EIP EIP是程序下一次要运行地方 寄存器 临时存放数据,按照Intel规定去存放 window API 微软提供的,用户可以操作系统的一些接口,以函数的形式体现 杀软是如何查杀恶意的 镜像地址 实际地址 实际运行后代码的地址 查外部调用段就可以定位到.rdat…

Android Kotlin:协程

目录: 1)协程是什么? 2)协程和线程的关系? 3)协程如何使用?切线程是什么 4)挂起函数是什么? 5)withContext和lanuch的区别在哪里? 6)…

Jenkins的相关概述和安装

Jenkins 1.什么是jenkins Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。耗内存max 2. 为什么使用Jenkins 拉取、编译、打包…

【初阶数据结构】9.二叉树(4)

文章目录 5.二叉树算法题5.1 单值二叉树5.2 相同的树5.3 另一棵树的子树5.4 二叉树遍历5.5 二叉树的构建及遍历 6.二叉树选择题 5.二叉树算法题 5.1 单值二叉树 点击链接做题 代码: /*** Definition for a binary tree node.* struct TreeNode {* int val;* …

探索 Electron:构建用户友好的登录页面流程

Electron是一个开源的桌面应用程序开发框架,它允许开发者使用Web技术(如 HTML、CSS 和 JavaScript)构建跨平台的桌面应用程序,它的出现极大地简化了桌面应用程序的开发流程,让更多的开发者能够利用已有的 Web 开发技能…

安防巡检机器人:守护安全的智能卫士

安防巡检机器人,作为机器人技术在安防领域的杰出应用,是一种集自主导航、智能巡检、环境监测、远程监控等多功能于一体的智能装备。这些机器人通过集成先进的传感器、高清摄像头、智能算法和导航系统等模块,实现了全天候、全方位、自主化的安…

maven项目容器化运行之3-优雅的利用Jenkins和maven使用docker插件调用远程docker构建服务并在1Panel中运行

一.背景 在《maven项目容器化运行之1》中,我们开启了1Panel环境中docker构建服务给到了局域网。在《maven项目容器化运行之2》中,我们基本实现了maven工程创建、远程调用docker构建镜像、在1Panel选择镜像运行容器三大步骤。 但是,存在一个问…

HDU1059——Dividing,HDU1060——Leftmost Digit,HDU1061——Rightmost Digit

目录 HDU1059——Dividing 题目描述 运行代码 代码思路 HDU1060——Leftmost Digit 题目描述 ​编辑​编辑 运行代码 代码思路 HDU1061——Rightmost Digit 题目描述 运行代码(快速幂) 代码思路 HDU1059——Dividing 题目描述 Problem - …

索引(数据库优化)事务

索引 事务 Spring事务管理 上图模拟的异常为运行时异常 加上这个配置之后如果回滚会显示下面异常信息 事务进阶

数模打怪(八)之图论模型

一、作图 图的数学语言描述: G( V(G), E(G) ),G(graph):图,V(vertex):顶点集,E(edge):边集 1、在线作图 https://csac…

【单词搜索】python刷题记录

R2-回溯:DFS剪枝. class Solution:def exist(self, board: List[List[str]], word: str) -> bool:#回溯经典问题&#xff1a;DFS剪枝解决mlen(board)nlen(board[0])def dfs(i,j,k):#3种剪枝策略if not 0<i<m or not 0<j<n or board[i][j]!word[k]:return Falsei…