索引(数据库重点!!!)

news2024/7/31 4:25:52

1.介绍

  • 索引(index)是帮助MySQL高效获取数据的数据结构。

2.索引结构

  • B+Tree索引:最常见的索引类型
  • Hash索引:哈希表实现
  • R-tree(空间索引)
  • Full-text(全文索引)

B-Tree(多路平衡查找树)

以一颗最大度数(max-degree)为5(5阶)的b-tree为例(每个节点最多存储4个key,5个指针)

B+Tree

以一颗最大度数为4的b+tree为例

Hash

哈希索引采用一定的hash算法,将键值换算成新的hash值,映射到对应的槽位上,然后存储在hash表中

思考题

为什么InnoDB存储引擎选择使用B+tree索引结构

  • 相对于二叉树,层级更少,搜索效率高
  • 对于B-tree,无论是叶子节点还是非叶子节点,都会保存数据,导致一页存储的键值减少,指针跟着减少,要同样保存大量数据,只能增加数的高度,导致性能降低
  • 相对Hash索引,B+tree支持范围匹配及排序操作

3.索引分类

在InnoDB存储引擎中,根据索引的存储形式,又可以分为以下两种:

聚集索引选取规则:

  • 如果存在主键,主键索引就是聚集索引
  • 如果不存在主键,将使用第一个唯一索引作为聚集索引
  • 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引

思考题

4.索引语法

  • 创建索引
  • 查看索引
  • 删除索引
-- 查看索引
show index from tb_user;
-- name字段为姓名字段,该字段的值可能会重复,为该字段创建索引
create index idx_user_name on tb_user(name);
-- phone手机号字段的值,是非空,且唯一的
create unique index idx_user_phone on tb_user(phone);
-- 为profession、age、status创建联合索引
create index idx_user_pro_age_sta on tb_user(profession,age,status);
-- 为email建立合适的索引来提升查询效率
create index idx_user_email on tb_user(email);
-- 删除索引
drop index idx_user_email on tb_user;

 SQL性能分析

  • SQL执行频率

MySQL客户端连接成功后,通过show[session|global]status命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的插入、查询、更新的访问频次:

show global status like 'com_______'; //7个下划线
  • 慢查询日志

记录了所有执行时间超过指定参数的所有SQL语句的日志

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

  • profile详情

show profiles能够在做SQL优化时帮助我们了解时间都耗费到哪里去了。通过have_profiling参数,能够看到当前MySQL是否支持profile操作:

select @@have_profiling;

  • explain执行计划

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

语法:直接在select语句之前加上关键字explain/desc

EXPLAIN执行计划各字段含义:

  • id:select查询的序列号,表示查询中执行select子句或者是操作表的顺序(id相同,执行顺序从上到下;id不同,值越大,越先执行)
  • select_type:表示SELECT的类型,常见的取值SIMPLE(简单表)、PRIMARY(主查询,即外层的查询)、UNION、SUBQUERY
  • type:表示连接类型,性能由好到差的类型为NULL、system、const、eq_ref、ref、range、index、all
  • possible_key:显示可能应用在这张表上的索引,一个或多个
  • Key:实际使用的索引,如果为null,则没有索引
  • Key_len:表示索引中使用的字节数
  • rows:MySQL认为必须要执行查询的行数,在innodb引擎的表中,是一个估计值
  • filtered:表示返回结果的行数占需读取行数的百分比,值越大越好

使用规则

  • 验证索引效率

索引失效原则 

  • 最左前缀法则

如果索引了多列,要遵守最左前缀法则。最左前缀法则指的是查询从索引的最左列开始,并且不跳过索引中的列。如果跳跃某一列,索引将部分失效

  • 范围查询

联合索引中,出现范围查询,范围查询右侧的列索引失效

  • 索引列运算

不要在索引列上进行运算操作,索引将失效

select * from tb_user where substring(phone,10,2) = '21';
  •  字符串不加引号

字符串类型字段使用时,不加引号,索引将失效

  • 模糊查询

如果仅仅是尾部模糊匹配,索引不会失效,如果是头部模糊匹配,则会失效

select * from tb_user where profession like '软件%';
explain select * from tb_user where profession like '软件%';
explain select * from tb_user where profession like '%工程';
  • or连接的条件

用or分割开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么设计的索引都不会被用到

  • 数据分布影响

如果MySQL评估使用索引比全表更慢,则不使用索引


  • SQL提示

SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的

use index:建议用哪个索引

ignore index:忽略用哪个索引

force index:强制用哪个索引

explain select * from tb_user use/ignore/force index(idx_user_pro) where profession = '软件工程';
  •  覆盖索引

  • 前缀索引

  • 单列索引与联合索引

单列索引:索引只包含单个列

联合索引:索引包含多个列

在业务场景中,如果存在多个查询条件,考虑针对于查询字段建立索引时,建议建立联合索引

联合索引情况:

  • 索引设计原则

1.数据量较大,且查询频繁的表建立索引

2.针对于常作为查询条件、排序、分组操作的字段建立索引

3.尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高

4.如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引

5.尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率

6.要控制索引的数量

7.如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它

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

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

相关文章

香港优才计划续签难吗?一次性说清楚优才续签要求,不在香港居住也能续签成功!

香港优才计划续签难吗?这个问题对考虑申请优才的人来说,还是挺重要的。我们申请优才,最关注的2个问题,一个是获批,还有一个就是续签了。 毕竟我们费那么大功夫申请优才,可不只是为了一个为期3年的香港临时…

从源码到上线:互联网医院系统与医疗陪诊APP的开发全程解析

今天,笔者将详细解析从源码到上线的整个开发过程,帮助读者了解如何构建一个功能完善、用户体验良好的互联网医院系统与医疗陪诊APP。 一、项目启动与需求分析 1、需求分析 对于互联网医院系统,需求通常包括预约挂号、在线问诊、电子处方、…

Python小游戏之Turtle图形游戏

一、引言 今天,我们将探索一个使用Python语言和Turtle图形库构建的简单图形游戏。这个游戏不仅能够激发我们的创造力,还能帮助我们理解基本的编程概念。 想象一下,你是一位艺术家,拥有一支神奇的画笔,可以在一个虚拟…

袋鼠云产品支持全栈信创适配,更加安全可靠、自主可控

随着国产替换的深化,企业对信创产品的需求逐渐融合更丰富的业务诉求以及未来数智规划,正从“同类替换”转向“迭代升级”。 当前,袋鼠云的产品与芯片、服务器、数据库、操作系统、中间件、云平台等主流信创厂商全面兼容适配,为企…

鸿蒙语言基础类库:【@ohos.worker (启动一个Worker)】

启动一个Worker 说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 Work…

第十九章 Nest multer 文件上传

上章我们了解了Express multer 文件上传的相关操作 本章将了解Nest中的文件上传。用 multer 包处理 multipart/form-data 类型的请求中的 file 新建个 nest 项目: nest new nest-multer-upload 安装 multer 的 ts 类型的包: npm install -D types/multer1、单文件…

Cesium中实现图层组

图层组 某天领导找我,说业务中可能存在多个影像服务为一个图层组,并且需要同时加载和同时在图层列表中上下移动的需求。 例如一些专题地图,包含所有学校、医院、公交站等图层,而这些图层都是单独发布的。 在 Cesium 中确实存在…

响应式建站公司企业官网源码系统 带源代码以及搭建部署教程

系统概述 响应式建站公司企业官网源码系统是一套集设计、开发、部署于一体的综合性解决方案。它旨在为企业提供一个易于定制、功能强大、适应各种设备屏幕的官方网站平台。 该系统采用先进的技术架构,确保网站的稳定性和性能。它能够与各种后端数据库和服务器环境…

爱秀国际英语公信力怎么样?靠谱吗?

同爱秀国际英语公信力怎么样? ①爱秀国际英语成立于09年,已经有15年的教学积累,专门针对大学生研发的英语口语课程。 ②历年来不仅教学效果显著,在社会上也获得过很多荣誉,在历年的教育大会上也荣获过诸多认可&…

一招杜绝 | 网站被劫持强制植入广告的问题

在我们日常上网过程中,经常会遇到打开一个网页,网页都还没有显示出来,一堆广告就弹出来的现象。或者网页刚刚打开,没几分钟 就会弹出来某游戏广告,注册领豪华坐骑等等的小广告。这些广告不仅仅会让我们对网站的真实性产…

eplan软件许可优化解决方案

Eplan软件介绍 Eplan是一款专业的电气设计软件,用于自动化工程和电气系统的设计与文档化。它由德国的Eplan Software & Service GmbH开发,并在全球范围内广泛应用于工程设计和电气工程领域。 Eplan软件提供了全面的工具和功能,以简化和优…

202-509SF 同轴连接器

型号简介 202-509SF是Southwest Microwave的连接器。这款连接器机身和法兰由不锈钢合金 UNS-30300 制成,螺纹接头则采用 5C360 黄铜合金。接触点采用 BeCu 合金,并经过镀金处理,以提供优异的导电性和耐腐蚀性。绝缘体则由 PTFE 氟碳或 ULTEM …

3.动态规划.基础

3.动态规划.基础 基础理论背包基础理论01背包完全背包多重背包 题目1.斐波那契数2.爬楼梯3.使用最小花费爬楼梯4.不同路径5.不同路径2 基础理论 动态规划,英文:Dynamic Programming,简称DP,如果某一问题有很多重叠子问题&#xf…

外卖霸王餐系统有什么推荐的

​ 在当今数字化的商业环境中,各种创新的营销策略层出不穷,其中微客云霸王餐系统以其独特的商业模式和营销策略,受到了众多商家的青睐。该系统不仅为商家提供了一个高效的营销工具,还通过一系列的功能和优势,帮助商家…

Qt QChart 曲线图表操作

学习目标:QChart 曲线图表操作 学习内容 QT中的QChart类提供了一个功能强大的图表绘制框架,可以根据需求方便高效地绘制各种类型的图表,主要特点如下: 支持多种常见图表类型,如线图、条形图、饼图、散点图等各种类型。开发者只需要选择合适的图表类和数据即可绘制…

Android APT实战

Android开发中,注解平时我们用的比较多,也许我们会比较好奇,注解的背后是如何工作的,这篇文章帮大家一步步创建一个简单的注解处理器。 简介 APT(Annotation Processing Tool)即注解处理器,在编译的时候可以处理注解然后搞一些事情,也可以在编译时生成一些文件之类的。…

【Linux】常见指令收官权限理解

tar指令 上一篇博客已经介绍了zip/unzip指令,接下来我们来看一下另一个关于压缩和解压的指令:tar指令tar指令:打包/解包,不打开它,直接看内容 关于tar的指令有太多了: tar [-cxtzjvf] 文件与目录 ...…

2.4G芯片开发的遥控玩具方案介绍 东莞酷得

玩具从早期的简单功能,到现如今各种各样的智能操作,发展的速度也是飞速的。随着玩具市场的逐步完善与推进,中国的智能玩具市场也出现了很多远程遥控玩具。遥控玩具也是从最初的有线到现在的无线,从地上跑的到天上飞的,…

jmeter分布式(四)

一、gui jmeter的gui主要用来调试脚本 1、先gui创建脚本 先做一个脚本 演示:如何做混合场景的脚本? 用211的业务比例 ①启动数据库服务 数据库服务:包括mysql、redis mysql端口默认3306 netstat -lntp | grep 3306处于监听状态&#xf…

LeetCode 88.合并两个有序数组 C写法

LeetCode 88.合并两个有序数组 C写法 思路: ​ 由题nums1的长度为mn,则我们不需要开辟新的数组去存储元素。题目要求要有序合并,于是可以判断哪边数更大,将更大的数尾插在nums1中。 ​ 定义三个变量来控制下标,end1控…