MySQL---索引

目录

一、索引的分类

二、索引的底层原理是什么?

2.1、Innodb和MyIsAM两种引擎搜索数据时候的区别:

2.2、为什么MySQL(MyIsAM、Innodb)索引选择B+树而不是B树呢?

2.3、Innodb的主键索引和二级索引(辅助索引)

2.4、MysIAM的主键索引树和二级索引树

 2.5、哈希索引​编辑

2.6、Innodb自适应哈希索引

三、索引的常见问题

3.1、当有多个索引的时候怎么用呢?比如 a=1 and  b=2 and c=3

3.2、涉及到强转(字符串转整型)用不到索引

四、 sql和索引优化问题,怎么切入?用慢查询日志


索引的优点: 提高查询效率

索引的缺点: 索引并非越多越好,过多的索引会导致CPU使用率居高不下,由于数据的改变,会造成索

引文件的改动,过多的磁盘I/O造成CPU负荷太重

一、索引的分类

物理上(聚集索引&非聚集索引),逻辑上(单列索引&多列索引)

1、普通索引:没有任何限制条件,可以给任何类型的字段创建普通索引(创建新表&已有的表,数量不限,一张表的一次sql查询只能用一个索引)用索引肯定是where过滤的时候用的

2、唯一性索引:使用UNIQUE修饰的字段,值不能够重复,主键索引就隶属于唯一性索引

3、主键索引:使用Primary Key修饰的字段会自动创建索引(MyISAM, InnoDB)

在InnoDB下,如果创建一张表,会默认增加一个整形字段的列去作为主键,而在MyISAM下不会默认生成,因为InnoDB的数据和索引是存在一个文件下的,.IBD 文件中,他必须建索引树,然后在索引树中存数据,没用索引树是存不了数据的 

4、单列索引:在一个字段上创建索引

5、多列索引:在表的多个字段上创建索引 (uid+cid,多列索引必须使用到第一个列,才能用到多列索引,否则索引用不上)

6、全文索引:使用FULLTEXT参数可以设置全文索引,只支持CHAR,VARCHAR和TEXT类型的字段

上,常用于数据量较大的字符串类型上,可以提高查询速度(线上项目支持专门的搜索功能,给后台服务

器增加专门的搜索引擎支持快速高校的搜索 elasticsearch 简称es C++开源的搜索引擎 搜狗的

workflflow)

以索引为过滤条件,也不一定会使用到索引的,MySQL会先进行一下sql分析,如果查出来的数据量跟整表搜索差不多的话,还不如直接就是整表搜索了。因为使用索引的步骤还是比较多的:

首先要读索引文件,花费磁盘io,还要扫描索引树,数据取不完的话最终还要去表上取数据,还不如直接扫描整个表呢

索引创建的细节:

索引优化:

1、给经常要作为where过滤的条件要加上索引

2、给字符串列创建索引的时候要考虑索引的长度越短越好(只要能区分索引值就行)

3、如果过滤条件过滤字段涉及类型强转就不能用到索引了,过滤条件用到MySQL的函数,也用不到索引了

二、索引的底层原理是什么?

b树比AVL树最大的好处就是在于磁盘I/O的次数少,在内存上搜索起来效率其实差不多的

2.1、Innodb和MyIsAM两种引擎搜索数据时候的区别:

假设搜索语句是:select * from student where name = 'ZhangSan';

MyIsAM:

        name  没有索引: 会对name.MYD文件进行整表扫描查询。

        name  有索引:会有一个name.MYI的文件,从这个文件中会把数据加载到内存上构建一个b树,花费一次磁盘I/O读取到的数据就刚好写在b树的一个节点上面(最多磁盘I/O三次就行了),然后从根节点上开始字符串的比较,效率是log(n),因为MyIsAM的数据和索引存在不同的文件上,所以找到的data存放的只是真实数据的地址,还要到name.MYD上去拿数据

Innodb:

        name  没用索引:也会默认有索引树,会自己生成一个整形的主键值,因为查的是name,相当于就说把这课b树整个内容全部搜索一遍,也和整表搜索没啥区别。 

        name  有索引:就会加载name的b树,进行快速搜索就行了。

2.2、为什么MySQL(MyIsAM、Innodb)索引选择B+树而不是B树呢?

 问:索引的底层原理是什么?

select * from student where name='ZhangSan';

当要执行一个sql语句的时候,MySQL会先去分析一下过滤条件,如果没用索引的话,就去整表搜索 ,如果有索引的话,操作系统会从磁盘上的索引文件中将数据读到内存当中,用B+树来构建,为什么用B+树呢?

因为B+树是一颗平衡树,搜索的效率很好,而且B+树一个节点一个节点构建的,每个节点对应着一次磁盘I/O,能用较少的I/O次数构建出B+树结构。

而且所有的data都存在叶子节点上,每次搜索数据查询次数都比较平衡,有链表。。。。 

2.3、Innodb的主键索引和二级索引(辅助索引)

重点:二级索引有回表,可以选择相应的列避免回表

 using  filesort 问题

2.4、MysIAM的主键索引树和二级索引树

索引和数据分开存放的叫非聚集索引,放一起的叫聚集索引

 2.5、哈希索引

2.6、Innodb自适应哈希索引

自适应索引不是我们主动去创建的,是MySQL为了优化自己去创建基于B+树

我们先来看自适应哈希索引是在什么条件下生成的:

 我们可以查看自适应哈希索引的开启情况

 查看分区情况

 自适应哈希索引也不一定能优化

三、索引的常见问题

3.1、当有多个索引的时候怎么用呢?比如 a=1 and  b=2 and c=3

 我们首先知道的是:一次sql只会用到一次索引,用到的是看哪个过滤出来的数据少,就用哪个,当然,也是可以进行强制指定到底用哪个索引的。

3.2、涉及到强转(字符串转整型)用不到索引

四、 sql和索引优化问题,怎么切入?用慢查询日志

slow_query_log  慢查询日志

MySQL可以设置慢查询日志,当SQL执行的时间超过我们设定的时间,那么这些SQL就会被记录在慢查

询日志当中,然后我们通过查看日志,用explain分析这些SQL的执行计划,来判定为什么效率低下,是

没有使用到索引?还是索引本身创建的有问题?或者是索引使用到了,但是由于表的数据量太大,花费

的时间就是很长,那么此时我们可以把表分成n个小表,比如订单表按年份分成多个小表等。

设置慢查询日志的参数:

 我们可以修改慢查询的时间阈值

1、 打开慢查询日志,设置合理的业务可以接受的慢查询时间。

2、 压测执行各种业务

3、 查看慢查询日志,找出所有执行耗时的sql

4、 用explain分析这些耗时的sql

5、         一、可能会出现用了 where + order by,有using  file  sort的问题。为什么会出现file sort 外部排序的情况呢?因为数据都是在磁盘上存放的,如果没有加合适的索引,就只能先将数据读到内存当中,然后再进行排序的了,可以将where和order  by 的数据进行一下联合索引,然后在进行。 

               二、可能是没有加索引 

               三、可能是where过滤条件用到了函数,导致没有用到索引

               四、可能涉及到了MySQL数据的强转(字符串转成了整型),没用到索引。        

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Ajax】笔记-Ajax案例准备与请求基本操作

案例准备HTML 按钮div <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>AJAX GET 请求</title&g…

2D、3D机器视觉各有优势与局限,融合应用将成工业领域生产新方式

在智能制造的浪潮中&#xff0c;制造行业生产线亟需转型升级&#xff0c;为国内机器视觉市场释放出了惊人的机器视觉技术及产品需求。在自动化工业质量控制和在线检测领域&#xff0c;2D机器视觉与3D机器视觉都具有重要的作用。那在机器视觉自动化场景中该如何选择合适的机器视…

python 乘法口诀

下面是一个用Python打印乘法口诀表的代码&#xff1a; print("乘法口诀表:")for i in range(1, 10):for j in range(1, i1):print(f"{j} {i} {i*j}", end"\t")print()

Blazor前后端框架Known-V1.2.4

V1.2.4 Known是基于C#和Blazor开发的前后端分离快速开发框架&#xff0c;开箱即用&#xff0c;跨平台&#xff0c;一处代码&#xff0c;多处运行。 Gitee&#xff1a; https://gitee.com/known/KnownGithub&#xff1a;https://github.com/known/Known 概述 基于C#和Blazor…

【图像处理】Python判断一张图像是否亮度过低,图片模糊判定

文章目录 亮度判断模糊判断 亮度判断 比如&#xff1a; 直方图&#xff1a; 代码&#xff1a; 这段代码是一个用于判断图像亮度是否过暗的函数is_dark&#xff0c;并对输入的图像进行可视化直方图展示。 首先&#xff0c;通过import语句导入了cv2和matplotlib.pyplot模块…

Element-Plus搭建CMS页面结构 引入第三方图标库iconfont(详细)

Element-Plus组件库使用 element plus组件库是由饿了么前端团队专门针对vue框架开发的组件库&#xff0c;专门用于电脑端网页的。因为里面集成了很多组件&#xff0c;所以使用他可以非常快速的帮我们实现网站的开发。 安装&#xff1a; npm install element-plus --save 引入…

jenkins 采用ssh方式连接gitlab连接不上

一、gitlab 添加jenkins服务器的公钥 jenkins 生成秘钥命令 ssh-keygen -t rsa2.jenkins 秘钥地址&#xff1a; cd /root/.ssh3.复制公钥 到gitlab 添加 cat id_rsa_pub4.添加私钥到jenkins cat id_rsa5.绑定&#xff08;顺利的话到这里就结束了&#xff09; &#xff0…

Linux下Lua和C++交互

前言 lua&#xff08;wiki 中文 官方社区&#xff1a;lua-users&#xff09;是一门开源、简明、可扩展且高效的弱类型解释型脚本语言。 由于其实现遵循C标准&#xff0c;它几乎能在所有的平台&#xff08;windows、linux、MacOS、Android、iOS、PlayStation、XBox、wii等&…

【条件与循环】——matlab入门

目录索引 if&#xff1a;else与elseif&#xff1a; for&#xff1a; if&#xff1a; if 条件语句块 endelse与elseif&#xff1a; if 条件代码块 elseif 条件代码块 else 代码块 endfor&#xff1a; for 条件循环体 end在matlab里面类似的引号操作都是包头又包尾的。上面的c…

postman测试接口出现404

postman测试接口出现404 1.用postman调试接口的过程中&#xff0c;出现404的情况&#xff0c;但是接口明明已调到了&#xff0c;而且数据也已经存入数据库了&#xff0c;这让我感到很疑惑。看网上的解决办法检查了我的路径&#xff0c;提交方式、参数类型等都是正确的&#xf…

安装adobe系列产品,提示错误代码81解决办法

安装adobe系列软件&#xff0c;如Photoshop、Premiere Pro、Illustrator等时&#xff0c;出现如下图提示错误代码81&#xff0c;如何解决呢&#xff1f;一起来看看。 解决方法一 (重启电脑等待5分钟再安装&#xff01;) 解决方法二 应用程序中打开Adobe Creative Cloud 点击…

Linux系统终端窗口ctrl+c,ctrl+z,ctrl+d的区别

时常在Linux系统上&#xff0c;执行某命令停不下来&#xff0c;就这几个ctrl组合键按来按去&#xff0c;今天稍微总结下具体差别&#xff0c;便于以后linux系统运维操作 1、ctrlc强制中断程序&#xff0c;相应进程会被杀死&#xff0c;中断进程任务无法恢复执行 2、ctrlz暂停正…

【运维工程师学习】Centos中MySQL替换MariaDB

【运维工程师学习】Centos8中MySQL替换MariaDB 1、查看已有的mysql2、MySQL官网tar包下载3、找到下载路径解压4、移动解压后的文件夹到/usr/local/mysql5、创建data文件夹&#xff0c;一般用于存放数据库文件数据6、创建用户组7、更改用户文件夹权限8、生成my.cnf文件9、编辑my…

ZooKeeper ZAB

文章首发地址 在接收到一个写请求操作后&#xff0c;追随者会将请求转发给群首&#xff0c;群首将探索性地执行该请求&#xff0c;并将执行结果以事务的方式对状态更新进行广播。一个事务中包含服务器需要执行变更的确切操作&#xff0c;当事务提交时&#xff0c;服务器就会将这…

23家企业推出昇腾AI系列新品 覆盖云、边、端智能硬件

[中国&#xff0c;上海&#xff0c;2023年7月6日] 昇腾人工智能产业高峰论坛在上海举办。论坛现场&#xff0c;大模型联合创新启动&#xff0c;26家行业领军企业、科研院所与华为将共同基于昇腾AI进行基础大模型与行业大模型应用创新。同时&#xff0c;华为携手伙伴联合发布昇腾…

数据从发出到接收的细节介绍{封装与解封装}

系列文章目录 数通王国历险记&#xff08;5&#xff09; 目录 前言 一&#xff0c;数据封装的全过程 1.1&#xff0c;应用层的封装形式 1.2&#xff0c;传输层的封装形式 理解&#xff1a; 1.3&#xff0c;网络层的封装形式 理解&#xff1a; 1.4&#xff0c;数据链路层…

IDEA设置自动导包功能

IDEA设置自动导包功能 选择File--Settings--Edotor-General-Auto Import&#xff0c;勾选上下图中的选项后点击 OK 即可。导包无忧~~ Add unambiguous imports on the fly&#xff1a;自动导入不明确的结构 Optimize imports on the fly&#xff1a;自动帮我们优化导入的包

Linux基础内容(25)—— 线程控制和线程结构

Linux基础内容&#xff08;24&#xff09; —— 线程概念_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/131294692?spm1001.2014.3001.5501 目录 1.线程操作 1.线程创建问题 2.线程终止问题 1.exit退出 2.pthread_exit退出 3.直接退出 3…

python接口自动化(三十)--html测试报告通过邮件发出去——中(详解)

简介 上一篇&#xff0c;我们虽然已经将生成的最新的测试报告发出去了&#xff0c;但是MIMEText 只能发送正文&#xff0c;无法带附件&#xff0c;因此我还需要继续改造我们的代码&#xff0c;实现可以发送带有附件的邮件。发送带附件的需要导入另外一个模块 MIMEMultipart。还…

Jupyter notebook添加与删除kernel

目录 1 添加虚拟环境的kernel 2 删除jupyter notebook已有的kernal 3 切换内核与查看当前内核 4 添加C语言的kernel 5 添加python2的kernel 6 添加java语言的kernel 6.1 sudo apt install default-jre 6.2 下载并安装 ijava 6.3 sudo apt install openjdk-11…