首页 > 数据库 >MySQL入门系列11-索引

MySQL入门系列11-索引

时间:2023-09-14 10:35:02浏览次数:45  
标签:11 INDEX name 支持 查询 索引 MySQL 数据结构

一、概念

索引是帮助MySQL高效获取数据的数据结构。数据库除了存储数据之外,还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用数据,当我们在查找数据的时候,就可以在这些数据结构上实现高级查找算法,快速查找我们需要的数据,这种数据结构就是索引。

在没有索引的情况下,查询数据就需要从第一行开始扫描,一直扫描到最后一行,我们称为全表扫描,性能很低。

在建立索引的情况下,我们的索引数据就是一个类似二叉树的数据结构,我们只需要查询很少的次数就可以获取到我们需要的数据。

使用索引的优点和缺点如下表所示:

优点

缺点

提高数据检索效率,降低数据库的IO成本

索引列会占用一定的空间

通过索引队列数据进行排序,降低数据排序的成本,降低CPU的消耗

索引大大提高查询效率,但是也降低更新表的速度,比如进行新增、修改、删除等操作效率不高。

二、索引数据结构

MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的索引结构。

索引结构

描述

B+Tree

最常用的索引类型

Hash

底层数据结构是用哈希表实现的,只有精确匹配索引队列的查询才有效,不支持范围查询,也无法利用索引完成排序,但是查询效率较高

R-tree(空间索引)

空间索引是MyISAM引擎的一个特殊索引类型,主要用于地理空间数据类型

Full-text(全文索引)

是一种通过建立倒排索引,快速匹配文档的方式,类似于Lucene,ES

不同的存储引擎对于索引结构的支持情况也有所不同

索引

InnoDB

MyISAM

Memory

B+tree

支持

支持

支持

Hash

不支持

不支持

支持

R-tree

不支持

支持

不支持

Full-text

支持

支持

不支持

我们平常所说的索引,如果没有特别指明,一般都是指B+树结构组织的索引。

特别说明:MySQL索引数据结构对经典的B+Tree进行了优化。在原B+Tree的基础上,增加了一个指向相邻叶子节点的链表指针,就形成了带有顺序指针的B+Tree,提高区间访问的性能,利于排序。


三、索引分类

在MySQL数据中,索引的具体类型主要有以下几类:

分类

含义

特点

关键字

主键索引

针对表中主键创建的索引

默认自动创建只能有一个

PRIMARY

唯一索引

避免同一个表中某列数据有重复值

可以有多个

UNIQUE

常规索引

快速定位特定数据

可以有多个


全文索引

全文索引查找的是文本中的关键词,而不是比较索引中的值

可以有多个

FULLTEXT

四、相关操作

1.创建索引

语法:

CREATE [ UNIQUE | FULLTEXT ] INDEX 索引名 ON 数据表名 (字段1,字段2,... );

SQL语句:

CREATE UNIQUE INDEX name_unique ON t_user (name );

MySQL入门系列11-索引_MySQL

2.查看索引

语法:

SHOW INDEX FROM 数据表名;

SQL语句:

SHOW INDEX FROM t_user;

MySQL入门系列11-索引_索引_02

3.删除索引

语法:

DROP INDEX 索引名 ON 表名;

SQL语句:

DROP INDEX name_unique ON t_user;

MySQL入门系列11-索引_优化_03

五、索引失效的情况

1.最左前缀法则

如果索引了多列,要遵守最左前缀法则。最左前缀法指的是:查询会从索引的最左列开始,最左边的索引列必须存在,否则索引全部失效。

比如我们表中创建了一个多列的联合索引。

CREATE INDEX idx_name_age ON t_user ( name, age );

MySQL入门系列11-索引_优化_04

我们在查询数据的时候name必须存在,如果不存在那么索引就不会生效。

MySQL入门系列11-索引_MySQL_05

我们加上name的查询条件,发送索引生效。

MySQL入门系列11-索引_索引_06

2.模糊查询

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

头部模糊查询,索引没有生效:

MySQL入门系列11-索引_优化_07

尾部模糊查询,索引生效:

MySQL入门系列11-索引_MySQL_08

六、使用优化

当字段类型为字符串时,有时候这些字段的值非常大,如果直接对这些字段建立索引的话,这会让索引变得很大,查询时浪费大量的磁盘IO,影响查询效率,这个时候我们可以将字符串的一部分前缀建立索引,这样可以大大节约索引空间,从而提高索引效率。

语法:

create index 索引名 on 表名(字段名(索引长度)) ;

SQL语句:

CREATE INDEX idx_name_limit ON t_user (name ( 5 ));

MySQL入门系列11-索引_索引_09

设计原则:

1.针对数据量大的、且查询比较频繁的表建立索引。

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

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

4.如果是字符串类型的字段,字段的长度很长,可以建立前缀索引。

5.在复合业务场景的情况下,尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。

6.要控制索引的数量,数量过多也会影响性能。


标签:11,INDEX,name,支持,查询,索引,MySQL,数据结构
From: https://blog.51cto.com/u_13312531/7467977

相关文章

  • P3214 [HNOI2011] 卡农
    原题首先我们先简化一下题意。为什么呢?因为这个题如果不简化题意是不太好做的我们考虑用二进制表示集合,这样题意为:有\(2^n-1\)个数,我们要从中选一个大小为\(m\)的无序子集,满足以下条件:集合中所有数的异或和为\(0\)集合中元素不可重复首先无序子集是吓人的,因为我们可......
  • MySQL+MHA搭建&&性能优化
    MHA基础概念MHAMHA(MasterHighAvailability)是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。MHA的出现就是解决MySQL单点的问题。MySQL故障切换过程中,MHA能做到0-30秒内自动完成故障切换操作。MHA能在故障切换的过程中最大程度上保证数据的一致性,以达到真正意义上......
  • mysql函数
     https://www.jb51.net/article/256828.htm#_label19 ......
  • 索引常见面试题
    索引常见面试题什么是索引?索引是数据的目录,用来加快数据的搜索,类似书本的目录可以分为几个类型数据结构b+树索引,通过b+树存储索引,但是非叶子节点保存数据,叶子节点保存数据hash索引:通过hash计算得出索引位置fulltext索引:也叫全文索引(我不会介绍)物理存储聚簇索引:索引......
  • 索引失效有哪些
    索引失效有哪些使用左模糊或者左右模糊匹配因为索引时按照从第一个字符开始排序,也就是按照前缀排序,左模糊查询的时候,符合查询条件的前缀是无规律的,并不能使用索引。查询条件中对索引字段进行做了函数,类型转换,计算操作之后因为索引保存的是原始值,并不是操作之后的数值,但是......
  • MySQL数据存放相关问题?
    MySQL的数据存放在哪个文件?MySQL的数据存放在哪个文件?存放在idb文件中表空间文件的结构是怎么样的?段-区-页-行,四个等级行:保存数据的最小单位页:mysql按照页读取数据,默认页大小为16KB区:B+树中每一层都是通过双向链表连接起来的,如果是以页为单位来分配存储空间,那么链表中......
  • 说一下索引覆盖,索引下推,回表
    说一下索引覆盖,索引下推,回表索引覆盖是指在查询过程中,查询的数据都能在二级索引的树中找到,不用根据主键查覆盖索引索引下推没有索引下推:执行器发送查询条件给存储引擎查找,存储引擎找到一条之后就返回给执行器,执行器判断当前记录是否符合条件,符合保留,不符合丢弃。重复过程,......
  • 9.11课堂问题
     1.java7以上版本允许使用下划线分割多个位数。 2.使用当前的区域语言特性格式化数字 3.枚举值的foreach迭代创建一个迭代器遍历MyEnum中的数据。 4.原码反码补码概念原码、反码和补码是计算机中用来表示整数的三种形式。对于正数,它的原码、反码和补码都相同。而对于......
  • 动手动脑9.11笔记整理2
    变量作用域的判定:  ......
  • P5505 [JSOI2011] 分特产
    原题还是二项式反演,主要问题是怎么发现他是这个关系因为我们发现我们钦定\(T,P\subseteqS,|T|=|P|\)时,我们假设里面有一个元素\(x,y\)不相同,则他们会计算两次因此是二项式反演......