MySQL---索引

news2024/11/25 12:29:14

目录

一、索引的分类

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

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数据的强转(字符串转成了整型),没用到索引。        

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

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

相关文章

【图游走+二分图】牛客小白月赛 43 F

F-全体集合_牛客小白月赛43 (nowcoder.com) 题意: 思路: 首先是经典的猜结论环节 这个结论可以想象特殊情况,把图看成一条链,多模拟几个例子 然后会发现一个很显然的结论:在链上的两个人点之间的距离一定是偶数 然…

【【51单片机的蜂鸣器实现小星星】】

用单片机的蜂鸣,实现简单小星星 我们在设置板子的时候要翻转 翻转IO口是因为使用了步进电机的多余的芯片管脚 我们翻转之后还想让它保持一段时间 就是先翻转500次 Delay(1)之后 就是最小的单位每隔1ms 周期就是2ms 频率就是500HZ 蜂鸣器播放音乐 我们首…

【040】巧妙地穿梭双端:掌握C++ STL中deque容器的强大功能

巧妙地穿梭双端:掌握C STL中deque容器的强大功能 引言一、deque容器概述二、deque容器实现原理三、deque容器常用API3.1、deque的构造函数3.2、deque的赋值操作3.3、deque的大小操作3.4、deque的双端插入和删除操作3.5、deque的数据存取3.6、deque的插入操作3.7、de…

Spring IOC AOP

IOC容器 概念 IOC,全程Inversion of Control(控制反转) 通过控制反转(创建对象的权限交给框架,所以叫反转)创建的对象被称为Spring Bean,这个Bean和用new创建出来的对象是没有任何区别的。 官…

排序算法第三辑——交换排序

目录 ​编辑 一,交换排序算法的简介 二,冒泡排序 冒泡排序代码:排升序 三,快速排序 1.霍尔大佬写的快速排序 2.挖坑法 3.前后指针法 四,以上代码的缺陷与改正方法 三数取中 三路划分: 五&#…

真的绝了,通过注释来埋点好简单!!

目录 回顾 开始 插件编写 功能一 功能二 功能三 合并功能 运行代码 总结 这篇文章主要讲如何根据注释,通过babel插件自动地,给相应函数插入埋点代码,在实现埋点逻辑和业务逻辑分离的基础上,配置更加灵活 回顾 上篇文章…

微服务系列文章之 Springboot应用在k8s集群中配置的使用

Docker部署其实也可以再docker run或者dockerfile里面,将配置文件目录映射到宿主机,然后通过宿主机配置文件修改参数。 FROM docker.io/python:3.6MAINTAINER tianye # 设置容器时间 RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&am…

Windows安装Oh-My-Posh美化Powershell

Windows Terminal:https://www.microsoft.com/store/productId/9N0DX20HK701 最新Powershell下载:https://github.com/PowerShell/PowerShell/releases Oh-My-Posh官网:https://ohmyposh.dev/ Nerd字体下载:https://www.nerdfonts…

Git源代码管理方案

背景 现阶段的Git源代码管理上有一些漏洞,导致在每次上线发布的时间长、出问题,对整体产品的进度有一定的影响。 作用 新的Git源代码管理方案有以下作用: 多功能并行开发时,测试人员可以根据需求任务分配测试自己的功能&#…

MyBatis-Plus条件查询问题解决

问题描述 系统中有用户注册的功能,但是会出现重复注册的现象,代码中有做过重复校验,但是没有生效。 问题解决 首先排查数据生成时间点不同,相差时间有长有短,不是用户同时多次点击的原因,应该是用户这边…

js判断两个数组是增加还是删除

JS判断两个数组的数据&#xff0c;增加的数据以及删除的数据。 // 第一个参数是新数组&#xff0c;第二个参数是旧数 const compareArrays function(arr1, arr2 ) {let remove []let add []// 旧数据循环for (let i 0; i < arr2.length; i) {let item arr2[i];if (arr…

EvilBox---One靶机复盘

EvilBox—One靶机复盘 这个靶场学会了原来id_rsa的私钥可以直接爆破&#xff0c;利用ssh2john工具提取私钥&#xff0c;然后john直接爆破就可以了。 靶场下载地址&#xff1a;https://download.vulnhub.com/evilbox/EvilBox—One.ova 这个靶场是直接给ip地址的我们就不用扫描…

Spring Boot使用httpcomponents实现http请求

基于org.apache.httpcomponents的httpclient实现&#xff0c;其它的实现方式都行。 1. pom文件 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/…

快速实现主从表编辑,实现多个不定长从表

目录 1 前言 2 不定长表、定长表的定义 3 根据已有的电子表格制作数据库表并导入数据 3.1 订单 3.2 订单明细 3.3 客户 4 配置主从关联关系 5 继续增加一个主从关联关系 6 测试一下运行结果 7 一段代码用于实现在panel中画出字段列表面板 1 前言 实际工作中&#xff…

扑克牌检测Y8S

采用YOLOV8训练&#xff0c;得到PT模型&#xff0c;然后直接转ONNX&#xff0c;使用OPENCV的DNN&#xff0c;不需要其他依赖&#xff0c;支持C/PYTHON 扑克牌检测Y8S

数据结构(王道)——线性表的存储结构之顺序表

线性表和顺序表的关系&#xff1a; 两种实现方式&#xff1a;静态分配、动态分配 总结&#xff1a;

Win7如何合并C盘与D盘?

电脑C盘不够用&#xff0c;需要把D盘的卷删除并合并到C盘中。 整体步骤&#xff1a; 1.右击此电脑-管理-磁盘管理。 2.假如要把D盘容量合并到C盘&#xff0c;右击D盘&#xff0c;选择删除卷&#xff0c;点击“是”。此时D盘数据会被清空&#xff0c;建议先备份数据。 3.删除…

消息队列MQ入门理解

功能特性: 物联网应用 物联网设备通过微消息队列(LMQ)连接云端,双向通信,数据传输;设备数据通过消息队列(MQ)连接计算引擎,分析数据或者源数据实时高效写入到 HiTSDB / HiStore / ODPS 等。 大规模缓存同步 在商业大促活动中,如“双11”大促,各个分会场会有琳琅…

基于输出调节的一致性编队控制

参考博客&#xff1a; https://blog.csdn.net/weixin_44346182/article/details/131747082 在输出调节的基础上&#xff0c;实现了输出一致性&#xff0c;而编队控制就是没有偏移量的状态一致性&#xff0c;恰好本题的C矩阵就是系统的第一阶的状态&#xff08;位置&#xff0…

spring boot security自定义权限检查

前言 鉴权主要分为身份认证和权限控制两部分&#xff1a; 身份认证&#xff1a;检查当前用户是否合法&#xff08;比如已登录&#xff09; 权限控制&#xff1a;检查当前用户是否有访问该资源的权限 本文主要给出一个示例&#xff0c;说明如何自定义权限控制。 因为一个完整的…