[沫忘录]MySQL索引

news2024/10/7 14:29:21

[沫忘录]MySQL索引

索引概述

  • 优点
    • 提高数据检索效率,降低数据库IO成本
    • 通过索引对数据进行排序,降低数据排序成本,降低CPU消耗
  • 缺点
    • 索引会占用一定空间
    • 当更新数据时,也需更新索引数据,这会降低数据的更新效率

索引结构

B+Tree索引

  • 最常见的索引类型,大部分引擎都支持B+树索引。只在叶子节点储存数据,且相邻叶子节点间有双向指针能够有效支持范围查询

Hash索引

  • 底层数据结构用hash表实现的,只有精确匹配索引列的查询才有效(即对等比较(=,in)),不支持范围查询(between, >, <, …)和利用索引完成排序操作

除此之外还有R-tree(空间索引), **Full-text(全文索引)**这些不常见的索引结构。
在这里插入图片描述

大多数索引结构默认由B+树组织。

索引分类

根据索引的功能索引可分为以下种类:

在这里插入图片描述

而根据索引的储存形式,也可分为以下类别:

在这里插入图片描述

聚集索引的选取规则(顺序):

  • 聚集索引
  • 唯一索引
  • InnoDB自动生成rowid作为隐藏的聚集索引

回表:通过二级索引查找到主键,再通过聚集索引找到对应数据。

索引语法

#显示指定表的索引
SHOW INDEX FROM 表名
#为字段创造索引
CREATE INDEX 索引名 ON 表名(字段名)
#为字段创造唯一索引
CREATE UNIQUE INDEX 索引名 ON 表名(字段名)
#为字段创造联合
CREATE INDEX 索引名 ON 表名(字段1, 字段2, ...)

tips:

  • 在业务场景中,如果存在多个查询条件,考虑对于查询字段建立索引时,建议建立联合索引而非单列索引
  • 多条件联查时,MySQL优化器会评估哪个字段的索引效率更高,选择该索引完成本次查询。

高效使用索引

SQL执行频率

#通过 show [session | global] status 命令可以查询mysql服务器的状态信息。
#而通过以下指令可以看到数据库INSERT, UPDATE, DELETE等语句的执行频次
SHOW GLOBAL STATUS LIKE 'Com_______'#七个占位符

慢查询日志

慢查询日志记录了所有执行时间超过指定参数(long_query_time, 单位:sec, 默认10 sec)的所有SQL语句的日志。

#查询慢查询日志的是否开启
SHOW VARIABLES LIKE 'slow_query_log';

mysql的慢查询日志默认没有开启, 需要在MySQL的配置文件(/etc/my.cnf)中配置信息

#开启MySQL慢查询日志开关
show_query_log = 1
#设置慢查询日志的时间(SQL语句执行时间超过2秒就会被视为慢查询,自动记录慢查询日志)
long_query_time = 2

profile优化

show profiles 能够在做SQL优化时帮助我们了解耗费时间的分配

通过以下指令能够看到当前MySQL是否支持profile操作(默认关闭)。

SELECT @@have_profiling

#设置开启
SET [GLOBAL | SESSION] profiling = 1;

#查看指定query_id(show profiles查看)的SQL语句各个阶段的耗时情况
show profile for query query_id;

#查看指定query_id的SQL语句的CPU使用情况
show profile cpu for query query_id;

explain执行计划

EXPLAIN或者DESC命令获取如何执行SELECT语句的信息,包括SELECT语句执行过程中如何连接和连接顺序。

#语法:直接SQL语句加EXPLAIN或DESC
EXPLAIN SELECT 字段列表 FROM 表名 WHERE 条件

在这里插入图片描述

在这里插入图片描述

索引的使用规则

最左前缀法则

在通过联合索引进行查询时,如果不通过联合索引的执行顺序进行查询(即按创建联合索引时,字段的书写顺序)进行查询,则未按照执行顺序查询的字段则会失效。

#字段1,字段2, 字段3创建的联合索引

EXPLAIN SELECT * FROM 表1 WHERE 字段1 = value, 字段3 = value;
#只有字段1有效

EXPLAIN SELECT * FROM 表1 WHERE 字段3 = value...
#联合索引无效,进行全文扫描

索引失效情况

  • 在索引列上进行运算操作(使用函数等操作),导致索引失效。
  • 字符串不加单引号,引起隐式类型转换,导致索引失效。
  • 使用头部模糊匹配(如%abc), 导致索引失效。
  • 使用or并列的条件,如果前者条件的字段没有索引,则之后条件字段的索引都失效。
  • 使用索引比全表扫描还慢(索引扫描的数据占数据的大部分),则索引失效。

索引提示(指定索引)

  • use index(建议使用该索引)
  • ingnore index(忽略使用该索引)
  • force index(强制使用该索引)
SELECT * FROM 表1 [USE INDEX | IGNORE INDEX | FORCE INDEX](索引名) WHERE ...

索引的使用

  • 尽量使用覆盖索引(避免回表查询)

    查询使用了某索引,需要返回的字段列在该索引中全部能找到。

    • use index: 该索引(多为主键或唯一)所携带的字段覆盖了所需的查询的字段(高效)且由于字段唯一,不需要做筛选。
    • use where: 加载了数据到内存(使用二级索引后,进行了回表),此时数据在server层,需要进行where条件的筛选。
    • use where; use index: 由于索引携带的字段覆盖了索引,不需要回表。但仍需要在server层做where条件的筛选。
    • use index condition: 对use where的优化,在回表之前使用二级索引对where条件筛选。减少了回表时加载到内存的数据量。

前缀索引

当建立索引的字段是字符串时,我们可能会遇到很长的字符串。如果使用大量很长的字符串做索引,在查询时会浪费大量磁盘I/O。这很影响查询效率。此时,我们们不妨取字符串的部分前缀来建立索引,这样的做法能够大幅节约索引空间,从而提高索引效率。

CREATE INDEX 索引名 ON 表名(字段名(前缀长度n));

当前缀越短,索引值越容易重复。所以我们应尽量保证前缀短的同时减少建立索引的前缀重复。

我们可以通过以下SQL语句查看索引的选择性(不重复的索引数与索引总数之比)

#查看一般索引的选择性
SELECT COUNT(DISTINCT 字段名)/COUNT(*) FROM 表名;
#查看前缀索引的选择性
SELECT COUNT(DISTINCT substring(字段, 1, n)) / COUNT(*) FROM 表名;

索引设计原则

在这里插入图片描述

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

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

相关文章

Adobe AE(After Effects)2023下载地址及安装教程

Adobe After Effects是一款专业级别的视觉效果和动态图形处理软件&#xff0c;由Adobe Systems开发。它被广泛用于电影、电视节目、广告和其他多媒体项目的制作。 After Effects提供了强大的合成和特效功能&#xff0c;可以让用户创建出令人惊艳的动态图形和视觉效果。用户可以…

LabVIEW变速箱自动测试系统

LabVIEW变速箱自动测试系统 在农业生产中&#xff0c;采棉机作为重要的农用机械&#xff0c;其高效稳定的运行对提高采棉效率具有重要意义。然而&#xff0c;传统的采棉机变速箱测试方法存在测试效率低、成本高、对设备可能产生损害等问题。为了解决这些问题&#xff0c;开发了…

[docker] 镜像部分补充

[docker] 镜像部分补充 这里补充一下比较少用的&#xff0c;关于镜像的内容 检查镜像 ❯ docker images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> ca61c1748170 2 hours ago 1.11GB node latest 5212d…

数据中心IP代理VS住宅代理IP,区别详解

一、什么是数据中心/机房IP代理&#xff1f; 数据中心/机房IP代理是使用数据中心拥有并进行分配和管理的IP的代理&#xff0c;俗称机房IP代理。 二、数据中心/机房IP代理的特点 与住宅代理通过使用ISP拥有和分配的IP地址的设备路由请求的情况不同&#xff0c;数据中心代理利…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之一 简单人脸识别

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之一 简单人脸识别 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之一 简单人脸识别 一、简单介绍 二、简单人脸识别实现原理 三、简单人脸识别案例实现简单步…

陇剑杯 流量分析 webshell CTF writeup

陇剑杯 流量分析 链接&#xff1a;https://pan.baidu.com/s/1KSSXOVNPC5hu_Mf60uKM2A?pwdhaek 提取码&#xff1a;haek目录结构 LearnCTF ├───LogAnalize │ ├───linux简单日志分析 │ │ linux-log_2.zip │ │ │ ├───misc日志分析 │ │ …

【蓝桥杯嵌入式】串口通信与RTC时钟

【蓝桥杯嵌入式】串口通信与RTC时钟 串口通信cubemx配置串口通信程序设计 RTC时钟cubemx配置程序设计 串口通信 cubemx配置 打开串口通信&#xff0c;并配置波特率为9600 打开串口中断 重定义串口接收与发送引脚&#xff0c;默认是PC4&#xff0c;PC5&#xff0c;需要改为P…

2024 CKA 基础操作教程(十四)

题目内容 设置配置环境&#xff1a; [candidatenode-1] $ kubectl config use-context mk8s Task 现有的 Kubernetes 集群正在运行版本 1.29.0。仅将 master 节点上的所有 Kubernetes 控制平面和节点组件升级到版本 1.29.1。 确保在升级之前 drain master 节点&#xff0c…

强强联手|AI赋能智能工业化,探索AI在工业领域的应用

随着人工智能&#xff08;AI&#xff09;技术的不断发展和应用&#xff0c;AI在各个领域展现出了巨大的潜力和价值。在工业领域&#xff0c;AI的应用也越来越受到关注。AI具备了丰富的功能和强大的性能&#xff0c;为工业领域的发展带来了巨大的机遇和挑战。 YesPMP是专业的互联…

IAM 统一身份认证与访问管理服务

即统一身份认证与访问管理服务&#xff0c;是云服务商提供的一套云上身份管理解决方案&#xff0c;可帮助企业安全地管理云上资源的访问权限。 在当今云计算时代&#xff0c;企业越来越依赖云服务来存储和处理敏感数据。然而&#xff0c;这也带来了新的安全挑战&#xff0c;即…

1 GBDT:梯度提升决策树

1 前言 前面简单梳理的基本的决策树算法&#xff0c;那么如何更好的使用这个基础算法模型去优化我们的结果是本节要探索的主要内容。 梯度提升决策树&#xff08;Gradient Boosting Decision Trees&#xff09;是一种集成学习方法&#xff0c;通常用于解决回归和分类问题。它通…

v-for中涉及的key

一、为什么要用key&#xff1f; key可以标识列表中每个元素的唯一性&#xff0c;方便Vue高效地更新虚拟DOM&#xff1b;key主要用于dom diff算法&#xff0c;diff算法是同级比较&#xff0c;比较当前标签上的key和标签名&#xff0c;如果都一样&#xff0c;就只移动元素&#…

【原创教程】海为PLC与RS-WS-ETH-6传感器的MUDBUS_TCP通讯

一、关于RS-WS-ETH-6传感器的准备工作 要完成MODBUS_TCP通讯,我们必须要知道设备的IP地址如何分配,只有PLC和设备的IP在同一网段上,才能建立通讯。然后还要选择TCP的工作模式,来建立设备端和PC端的端口号。接下来了解设备的报文格式,方便之后发送报文完成数据交互。 1、…

B端和C端产品有哪些区别,运营模式有很大区别!

做设计这么多年&#xff0c;经历了 C 端的设计&#xff0c;也实战了 B 端的设计&#xff0c;之前一直以为它们差不多&#xff0c;仔细研究过后&#xff0c;发现它们原来还是有很多不一样的&#xff0c;今天就细细的来聊下它们两者的差异和不同。 B 端&#xff1a;产品是企业识别…

UT单元测试

Tips&#xff1a;在使用时一定要注意版本适配性问题 一、Mockito 1.1 Mock的使用 Mock 的中文译为仿制的&#xff0c;模拟的&#xff0c;虚假的。对于测试框架来说&#xff0c;即构造出一个模拟/虚假的对象&#xff0c;使我们的测试能顺利进行下去。 Mock 测试就是在测试过程…

Java SpringBoot基于微信小程序的高速公路服务区充电桩在线预定系统,附源码

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

自定义类似微信效果Preference

1. 为自定义Preference 添加背景&#xff1a;custom_preference_background.xml <?xml version"1.0" encoding"utf-8"?> <selector xmlns:android"http://schemas.android.com/apk/res/android"><item><shape android:s…

Linux-时间同步服务器

1. (问答题) 一.配置server主机要求如下&#xff1a; 1.server主机的主机名称为 ntp_server.example.com 编写脚本文件 #!/bin/bash hostnamectl hostname ntp_server.example.com cd /etc/NetworkManager/system-connections/ rm -fr * cat > eth0.nmconnection <&…

JSON数据格式讲解与cJSON库的使用

文章目录 写在前面一、安装cJSON二、使用cJSON1、使用的文件2、如何传输数据&#xff1a;**** 三、JSON语法四、cJSON函数讲解1、cJSON结构体 **2、cJSON结构体与字符串之间的转换&#xff08;重要&#xff09;2.1、标题将cJSON结构体转换为字符串(常用)2.2、将字符串转为cJSON…

设计模式—门面模式

定义: 门面模式,也称为外观模式&#xff0c;是一种结构型设计模式。它的主要目的是提供统一的接口来访问子系统中的多个接口&#xff0c;从而简化客户端与复杂子系统之间的交互。 在门面模式中&#xff0c;一个门面类充当中介&#xff0c;为客户端提供一个简化了的访问方式&…