首页 > 其他分享 >【索引】对索引的理解

【索引】对索引的理解

时间:2024-08-17 14:25:25浏览次数:10  
标签:聚簇 扫描 查询 索引 理解 使用 主键

什么是索引?

索引是存储引擎用于快速找到数据的一种数据结构,比如一本书有500页,我们要查询其中的一个知识点,在没有目录的情况下要查很久,有目录就可以很快查到,索引就相当于目录。

索引的优缺点

优点:减少服务器需要扫描的数据量、帮助服务器避免排序和建立临时表、将随机IO变为是顺序IO

缺点:物理角度:创建索引需要占用存储空间;时间角度:创建和维护索引需要大量的时间,对数据进行增删改的时候都需要维护索引

索引分类

  • 数据结构角度
    • 树索引
    • 哈希索引
  • 物理存储角度
    • 聚簇索引:聚簇索引就是按照每张表的主键构造一棵B+树,同时叶子节点中存放的就是整张表的行记录数据,聚簇索引的叶子节点被称为数据页
    • 非聚簇索引:非聚簇索引的结构和聚簇索引基本相同(非叶子节点存储的都是索引指针),区别在于叶子节点存放的不是行数据而是指向数据行的主键。因此在使用非聚簇索引进行查找时,需要先查到主键值,然后再到聚簇索引中进行查找或者直接到数据表中查找对应的行数据(回表)
  • 逻辑角度
    • 普通索引
    • 唯一索引:建立在 unique 字段上的索引被称为唯一索引,一张表可以有多个唯一索引,索引列值允许为空,列值中出现多个空值不会发生重复冲突
    • 主键索引
    • 联合索引
    • 全文索引

 索引底层使用的数据结构

MySQL 中常用的是 Hash 和 B+树索引

  • Hash 索引:基于哈希表实现,非常快,但是不支持范围查找和排序,在 MySQL 中支持的哈希索引是自适应的,不能人为创建
  • B+树索引:B+树索引就是传统意义上的索引,是目前关系型数据库中查找最为常用和最为有效的索引。B+树索引能够加快访问数据的速度,因为存储引擎不在需要进行全表扫描来获取需要的数据。B+树索引是顺序组织存储的,所以很适合查找范围数据。B+树索引分为聚簇索引(主键索引)和非聚簇索引(二级索引)

 索引的设计原则

  1. 为经常作为查询条件的字段建立索引:如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,为这样的字段建立索引,可以提高整个表的查询速度
  2. 为经常需要排序、分组和联合操作的字段建立索引:经常需要 order by、group by、distinct 和 union 等操作的字段,排序会浪费很多时间。如果为其建立索引,可以有效地避免排序操作
  3. 创建唯一性索引:唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录
  4. 限制索引的数目:每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大,修改表时,对索引的重构和更新很麻烦
  5. 小表不建议索引(如数量级在百万以内):由于数据较小,查询花费的时间可能比遍历索引的时间还要短,索引可能不会产生优化效果
  6. 尽量使用前缀索引:如果索引的值很长,那么查询速度会受到影响
  7. 删除不再使用或者使用很少的索引

索引使用策略 

  1. 独立的列:索引使用不当会导致索引失效(查询中实际没有使用索引)。如果查询中的列不是独立的,MySQL 不会使用索引。独立的列指查询时索引列不能是表达式的一部分,也不能是函数的参数,这两种情况都会导致索引失效
  2. 前缀索引:使用前缀索引可以节约索引空间,从而提高索引效率,但是需要平衡索引的选择性
  3. 使用联合索引:使用联合索引可以避免回表,实现覆盖索引,可以减少大量 IO 操作
  4. 合适的索引列顺序:创建联合索引时,不同的列顺序会影响索引的性能,通常将选择性高的列放在最前面
  5. 合适的主键:最好选择不会修改的列作为主键,不考虑分库分表的情况最好使用自增主键
  6. 不建立重复的索引和不使用的索引

索引失效的情况 

  1. 查询条件包含 or,or 的前后不都是索引
  2. 使用 like 查询,%在前面且没有走覆盖索引
  3. 对索引列使用函数
  4. 索引列使用运算
  5. 索引列使用不等于(< > != not in)
  6. 出现隐式类型转换,如字符型索引使用数字匹配
  7. 联合索引没有使用最左匹配
  8. 全表扫描比索引快(数量很少)

判断 SQL 语句是否走了索引

 在 SQL 语句前加 explain 

explain 各属性的含义:

  • type:访问类型
    • ALL:扫描全表
    • index:扫描全部索引树
    • range:扫描部分索引,索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行,常见于 between、等的查询
    • ref:使用非唯一索引或非唯一索引前缀进行查找
    • eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
    • const,system:单表中最多有一个匹配行,查询起来非常迅速,例如根据主键或唯一索引查询。system是const类型的特例,当查询的表只有一行的情况下,使用system
    • NULL:不用访问表或者索引,直接就能得到结果,如 select 1 from test where 1
  • key:显示MySQL实际决定使用的索引。如果没有索引被选择,是NULL
  • key_len:使用到索引字段的长度,key_len 显示的值为索引字段的最大可能长度,并非实际使用长度,即 key_len 是根据表定义计算而得,不是通过表内检索出的
  • Extra:执行情况的说明和描述。包含不适合在其他列中显示但十分重要的额外信息
    • Using index:表示使用索引,如果只有 Using index,说明他没有查询到数据表,只用索引表就完成了这个查询,这个叫覆盖索引
    • Using where:表示条件查询,如果不读取表的所有数据,或不是仅仅通过索引就可以获取所有需要的数据,则会出现 Using where

标签:聚簇,扫描,查询,索引,理解,使用,主键
From: https://blog.csdn.net/2301_77562764/article/details/141276956

相关文章

  • 高效使用搜索引擎
    基本搜索技巧善用关键词用有实际意义、具体的词语,尽量去除不重要的虚词(如停用词)不同关键词组合换位思考。站在作者或者开发者的角度,想一想他们会用什么关键词来描述其内容。搜索工具高级搜索进阶搜索语法——命令搜索所有命令的标点都是英文输入法下的标点。命令讲......
  • 数据库视图,索引,触发器
    数据库视图,索引,触发器视图mySQL中的视图是⼀种虚拟表,它是基于⼀个或多个基础表(或其他视图)的select查询结果集。虚拟表是⼀种逻辑上的表,它不实际存储数据,⽽是在查询时动态⽣成结果集。因此,视图并不是真正的表,⽽是基于⼀个或多个表的查询结果的⼀种“虚拟表”。视图可以看作......
  • WPF控件结构与Content理解
    WPF控件结构WPF中控件继承图我们平时所用的容器如Grid、StackPanel等都是继承Panel控件类型分为3组:内容控件、Items控件、TextBoxBase如何理解Content?凡是继承ContentControl的控件,定义内容为Content,除了TextBlock用text以外,大部分都是用Content设置显示类容。一个窗......
  • 【JAVA】深入理解守护线程与非守护线程:概念、应用及示例
    文章目录介绍1.线程的基础知识2.守护线程与非守护线程2.1什么是守护线程?特点:2.2什么是非守护线程?特点:3.为什么需要守护线程?示例:后台任务处理示例:日志记录4.非守护线程的应用场景示例:数据库连接处理5.守护线程与非守护线程的对比6.总结更多相关内容可查......
  • Mysql库表无索引查询优化
    情况单表三千万数据量,只有id这一个索引无其他索引,这时候使用无索引的kh字段查询数据分页查询优化explainSELECT *FROM dev_log_27_2024WHEREjd_kh='14344692103'ORDERBY idDESCLIMIT0,10000带where不带wheresql执行流程全表扫描(FullTableSc......
  • Java 8 Stream API: 深入理解与高效使用
    Java8StreamAPI:深入理解与高效使用大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!Java8引入的StreamAPI为集合操作提供了一种声明式的处理方式,它不仅可以使代码更加简洁易读,还能提高性能。本文将深入探讨StreamAPI的内部机制,并展示如何高效......
  • 小学生教你微积分,用编程理解高数(python,C,C++)
    一、代码实现微分(实际上是导数,微分不用除dx):python代码:x=0dx=0.00001deff(x):y=2*xreturnyprint((f(x+dx)-f(x))/dx)C语言代码:#include<stdio.h>doublex=1;doubledx=0.00001;doublef(doublearg){doubley=2*arg;returny;}......
  • 有关线段树的一些细节理解
    写在前面本菜鸡线段树学了好多遍但是每次写还是得很长时间有时有一个细节还要琢磨半天所以为了今后避免以上事情发生本菜鸡决定将这么长时间以来对线段树的认识汇总好日后清算模板#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=1e5;i......
  • 机械学习—零基础学习日志(如何理解线性代数3)
    零基础为了学人工智能,正在快乐学习,每天都长脑子行列式最早行列式,是莱布尼茨用于判断,一个方程有没有解。例如,三元一次方程,如果有解,对应行列式就有值,但是如果无解,那么对应的行列式则为零。线性映射一个方程组可以写成上述的形式,而A就是线性映射。这里可以把向量x,理解为输入......
  • KMP算法——理解 next 数组
    !注意!本文与《王道》,《严书》有所不同,字符串均从第0位开始,next数组没有添加常数1。博客为梳理思路所用,难免纰漏,希望不吝赐教。在字符串匹配中,设m为待匹配的主串S长度,n为找寻的模式串T长度。如:在主串S='ababc'中寻找模式串T='abc'则字符串匹配算法返回S中第......