MySQL优化-03索引

索引

一.索引的作用

  1. 一个索引就是一颗B+树,索引让我们可以快速定位和扫描到我们想要的数据,增加查询速度。
  2. 在一个select查询语句中最多用到一个二级索引,即使在where条件中使用了多个二级索引。

二.InnoDB存储引擎支持的索引

B+树索引、哈希索引、全文索引,其中最重要的是B+树索引,它是mysql最常用的索引。

三.B+树索引

1.聚簇索引/聚集索引

  1. 它是一种主键索引,MySql 会通过主键生成一颗B+树,B+树的叶子节点中存储的是整行数据。
  2. 如果没有主键,MySql会通过rowId来生成B+树。

2.辅助索引/二级索引

  1. 它是Mysql由索引列生成的一颗B+树,B+树的叶子节点存储内容不包行记录的全部数据,它存储除了包含键值以外,还包含一个书签来存储主键。
  2. 每定义一个二级索引就会生成一颗B+树。
  3. 如果查询的内容不是索引列也不是主键列,那么会进行回表操作,所谓回表就是通过二级索引找到叶子节点,再拿叶子节点的主键去主键索引中查找内容,比较耗时,因此应该尽量少的避免回表操作。

3.联合索引/复合索引

  1. 它是由多列组成的索引,MySql通过联合索引生成一颗B+树,它的叶子节点存储的是作为联合索引的列数据+主键。
  2. B+树遵循最左侧优先排原则,所谓最左侧优先排原则就是B+会根据从左到右的列进行排序。

4.覆盖索引

  1. 如果从辅助索引中可以查询到的记录,而不需要查询聚簇索引中的记录,从而避免回表操作。
  2. 它不是索引类型的一种。

举个例子:表student中有id,name,age,desc四个列,创建一个name+age的联合索引;

  1. select name from student where age = ‘18’,使用了覆盖索引,可以直接从联合索引中取到name;
  2. select name,desc from student where age = ‘18’,没有使用覆盖索引,因为desc列需要回表操作,从聚簇索引中取数据;

四.自适应Hash索引

  1. 决定B+树索引的效率是树的高度,MySql一般B+树的高度一般为34层,那么就需要34此的IO操作来查询数据。因此,Mysql提供了Hash索引。
  2. 对于热数据来说,使用B+树索引效率慢。
  3. MySql监控会对热数据创建Hash索引,只需要一次操作就可以查询到数据,底层是除法散列表。
  4. 它的缺点是无法排序。
  5. MySql5.7开始,自动开启自适应Hash索引。SHOW ENGINE INNODB STATUS 命令查看Hash索引

五.高性能索引创建策略

索引列的类型尽量小(主键)

  1. 这个条件只针对主键来讲。
  2. 因为二级索引、联合索引都要存储主键列,索引索引越小,占用的空间越小,同样的内存空间存储的数据行数越多,IO操作越少,同时cup执行越快。

索引列离散型高

  1. 索引列的离散型越高,索引效率越高,离散型=不重复索引值的/表记录总数。
  2. 使用 select count(distinct 列)/count(*) from table可以计算离散型。越接近1越适合做索引。

前缀索引

  1. 对于字段比较长的列,比如blob、text、很长的varchar,mysql不支持索引她们的全部长度,可建立前缀索引。
  2. 语句:alert table 表名 add key/index (column(x)),x表示前缀长度。
  3. 使用select count(distinct left(列名,长度x))/count(*) from table确定x的合适值。
  4. 它不支持group by 和 order by,也无法覆盖索引,因为要回表。

后缀索引

mysql不支持后缀索引,可以增加一个列将后缀倒排放到列中,给新增的列加索引。使用场景:邮箱后缀。

以上三个都是对于单个索引的创建策略

多列索引

  1. 多列索引的创建一般要根据不同的业务场景来创建。
  2. 一般来讲:
    1. 将离散型高的列放到索引前面。
    2. 根据运行频率最高的查询来调整索引列。
    3. 性能优化时,需要相同的列,不同的顺序来创建索引。比如order a,b,c 和order c,b,a来创建两个列相同但顺序不同的索引。

三星索引

满足条件:

  1. 索引的选择性:索引的字段能够显著减少查询结果集的大小,即索引字段的唯一值越多,能够过滤掉的数据越多,从而获得一颗星。
  2. 排序和分组性能:如果索引的列排序顺序能够匹配查询语句中的ORDER BY或GROUP BY的顺序,这样的索引可以被评定为两颗星。这允许查询直接利用索引完成排序或分组,避免了额外的排序操作。
  3. 覆盖索引:如果索引包含了查询语句中所有的列,那么这个索引就是一个覆盖索引,会被评定为三颗星。这意味着查询可以仅通过访问索引获取所有需要的信息,无需访问实际的数据表,从而大大提高查询效率。

综上所述,三星索引是指在选择性、排序和分组性能以及覆盖索引三个方面都达到最优的索引。这种索引能够最小化必须扫描的索引片宽度,避免排序操作,以及避免回表操作,从而极大地提升查询效率。然而,三星索引也有其缺点,比如在小型表和超大型表上的效果可能不佳,因为小型表的全表扫描代价很小,而超大型表的索引维护成本很高。

六.高性能索引使用策略

1. 不在索引上做任何操作

不要在索引列上做任何操作,如计算、函数、(自动/手动)类型转换等,这些操作都会导致索引失效而转向全表扫描。

2. 全值匹配法则

搜索条件和索引列相同,顺序没有影响,因为查询优化器存在。

3. 最佳左前缀法则

在使用复合索引时,查询的过滤条件必须从索引的最左边开始,并且不能跳过中间的列。

5. 覆盖索引尽量用

减少回表操作。

6. 索引的否定条件

在使用不等于 !=、<> 的时候无法使用索引会导致全表扫描;IN 走索引(多值精确匹配),NOT IN 索引失效,导致全表扫描;

7. 字符串加引号

如果使用数字类型相当于在索引列上做操作,导致索引失效。

8. OR关键字使用UNION替换

用 OR 分割开的条件, 如果 OR 前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。所以,对于包含 OR 的查询子句,如果要利用索引,则 OR 之间的每个条件列都必须用到索引,而且不能使用到复合索引;如果没有索引,则应该考虑增加索引。

9. 范围条件放最后

  1. 左边列是精确查找,则右边列可进行范围查找
  2. 中间有范围查找会导致后面列全部失效,无法充分利用联合索引

10.is null 和 is not null

  1. sql1: select * from emp where id is null;
  2. sql2: select * from emp where id is not null;
  3. 如果id可为空sql1会走索引,如果不可为空where条件没用;
  4. 无论id是否可以为空,都走全表扫描

11.like模糊查询

尽量%放到后面,放前面索引失效;覆盖索引可解决此问题

12.排序

尽量要用B+树中的顺序一致;

13.尽量使用主键顺序插入行

比如自增ID,插入数据就直接往后面插就可以了,而uuid会往B+树中间插数据;

14.limit优化

  1. 自身表关联查询用ID主键;
  2. where用ID过滤比如 where id > xxx;

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

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

相关文章

Rust :给数据类型起一个别名

在 Rust 中&#xff0c;你可以为类型定义别名&#xff0c;以便简化代码和提高可读性。类型别名使用 type 关键字来定义。这在你想要给复杂的类型&#xff0c;如闭包类型、结果类型&#xff08;Result&#xff09;或迭代器类型等&#xff0c;定义一个更具描述性的名称时特别有用…

“知识世界”项目的自动化测试

目录 1.项目介绍 1.1 项目功能介绍 2. 项目测试 2.1 需求分析 2.2 测试计划 2.3 设计测试用例 &#xff08;1&#xff09; 设计 登录 的测试用例 &#xff08;2&#xff09;设计 文章列表页 的测试用例 &#xff08;3&#xff09;设计 详情页 的测试用例 &#xff08…

恒定导通时间控制COT

核心是让反馈脚上的文波电压与电感电流文波同相位

车载测试系列:车载常见面试题

自我介绍项目介绍项目具体是怎么测试的&#xff1f;CANoe是怎么使用的&#xff1f;台架是怎么搭建的&#xff1f;台架怎么测试的&#xff1f;诊断服务是怎么测试的&#xff1f;功能寻址和物理寻找的区别10服务有什么会话&#xff1f;11服务怎么确定软件复位和硬件复位是什么&am…

Redis缓存的基本概念和使用

Redis缓存的基本概念和使用 什么是缓存Redis缓存缓存更新策略缓存穿透缓存雪崩缓存击穿缓存工具类封装 什么是缓存 缓存时数据交换的缓冲区&#xff0c;存储数据的临时区&#xff0c;读写性能较好。 例如计算机的三级缓存。CPU的计算速度超过内存的读写速度&#xff0c;为了平…

Gauge32类型的数据转换成int类型的数据

提前编译号snmp的库 #include <iostream> #include <libsnmp.h>#include "snmp_pp/snmp_pp.h"#ifdef WIN32 #define strcasecmp _stricmp #endif#ifdef SNMP_PP_NAMESPACE using namespace Snmp_pp; #endifusing namespace std; using namespace Snmp_pp…

JAVA抽象类,接口与内部类,常用API知识总结

文章目录 抽象类和抽象方法抽象类的定义格式抽象方法的定义格式注意事项 接口定义和使用成员特点和类之间的关系新增JDK8新增方法JDK9新增方法 总结设计模式 内部类使用场景分类成员内部类获取内部类对象访问成员变量 静态内部类局部内部类匿名内部类格式使用场景 示例 常用API…

java选择题

题目来牛客网 1.类中的数据域使用private修饰为私有变量&#xff0c;所以任何方法均不能访问它。 A.正确 B.错误 答案&#xff1a;B&#xff0c;本类可以使用&#xff0c;反射也可以。 2.在类Tester中定义方法如下 public double max(int x, int y){//省略 } 则在该类中定义…

数据集个人记录

Dataset 垂域数据集 240万条中文医疗数据集(包括预训练、指令微调和奖励数据集)&#xff1a;shibing624/medical 22万条中文医疗对话数据集(华佗项目)&#xff1a;shibing624/huatuo_medical_qa_sharegpt 通用数据集 Pretraining datasets 16GB中英文无监督、平行语料Lin…

JVM内存信息分析

jmap安装使用 java - version 查看已安装jdk的版本 sudo apt-get install openjdk-11-jdk-headless 安装jmap jmap -version 验证是否安装成功 jmap -dump:live,formatb,filexxxx.hprof pid 导出jvm内存信息&#xff0c;pid一般为java进程id内存信息分析 strings xxx.phrof |…

459.重复的子字符串

给定一个非空的字符串&#xff0c;判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母&#xff0c;并且长度不超过10000。 示例 1: 输入: "abab"输出: True解释: 可由子字符串 "ab" 重复两次构成。 示例 2: 输入: "aba&q…

MySQL优化-04慢查询和执行计划

慢查询 慢查询配置 MySQL记录所有执行超过long_query_time参数设定实际阈值的SQL语句日志 常用命令 SHOW VARIABLES like slow_query_log;--是否开启慢日志 SHOW VARIABLES like long_query_time;--时间阈值设置 SHOW VARIABLES like %log_queries_not_user_indexes%;--没有使…

chap5 I/O管理

目录 一、I/O设备基本概念和分类 304 1.concept 2.classification &#xff08;1&#xff09;根据信息交换单位&#xff08;可能考&#xff09; 1)字符设备 2)块设备 &#xff08;2&#xff09;传输速率&#xff08;以下了解即可&#xff09; &#xff08;3&#xff09;…

R语言数据分析案例-股票可视化分析

一、数据整合的对象 # Loading necessary libraries library(readxl) library(dplyr)# Reading the data from Excel files data_1 <- read_excel("云南白药.xlsx") data_2 <- read_excel("冰山.xlsx")二、数据整合的代码 # Reading the data from…

OBS插件--音频采集

音频采集 音频采集是一款 源 插件,类似于OBS的win-capture/game-capture&#xff0c;允许从特定应用程序捕获音频&#xff0c;而不是捕获整个系统的音频。避免了因为特定音频的采集而需要引入第三方软件&#xff0c;而且时延也非常低。 下面截图演示下操作步骤&#xff1a; 首…

Oracle数据库之基本查询详解(三)

目录 sql简介 DML&#xff08;数据库操作语言&#xff09; DDL&#xff08;数据库定义语言&#xff09; DCL&#xff08;数据库控制语言&#xff09; Select语句的语法格式 通过列名查询 1. 通过列名查询所在的表 2. 通过列名查询列的数据 4. 使用PL/SQL块查询 别名的…

【顺序程序设计-谭浩强适配】(适合专升本、考研)

无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 无偿分享学习资料&#xff0c;需要的小伙伴评论区或私信dd。。。 完整资料如下&#xff1a;纯干货、纯干货、纯干货&#xff01;&#xff01;…

springboot 设置response和request的默认格式 驼峰或者SNAKE_CASE

springboot 设置response和request的默认格式 驼峰或者SNAKE_CASE。 我们使用默认配置的情况下&#xff0c;response和request是由jackson jason序列化和解析的&#xff0c;因此&#xff0c;我们只需要配置好jackson json的默认格式就可以。 要设置 jackson json默认的更多格式…

WEB后端复习——监听器、过滤器

Listener监听器 是Servlet规范中定义的一种特殊类&#xff0c;它用于监听web应用程序中的ServletContext, HttpSession和ServletRequest等域对象的创建与销毁事件&#xff0c;以及监听这些域对象中的属性发生修改的事件。 注解WebListener 1.ServletContextListener 监听Serv…

U盘文件遇损?拯救“文件或目录损坏且无法读取”的秘籍!

在数字化时代&#xff0c;U盘已成为我们日常生活与工作中不可或缺的数据存储和传输工具。然而&#xff0c;有时我们可能会遇到一个非常令人沮丧的问题——U盘中的文件或目录突然损坏且无法读取。这种突发状况往往让人措手不及&#xff0c;甚至可能引发数据丢失的严重后果。那么…