Mysql索引实现原理与创建索引

索引:

提高查询效率,
消除数据分组/排序,
避免 “回表” 查询 ,
优化聚合查询,
用与多表 JOIN 关联查询,
利用唯一性约束保证数据唯一性,
lnnoDB行锁实现。

什么是索引:

索引用于快速找出在某个列中有 一特定的值的行,不使用索引,Mysql
必须从第一条记录开始读完整个表,表越大,查询数据所花费的的时间越多。如果表中查询的列有一个索引,Mysql 能够快速到达一个位置去搜索数据文件。而不必查看所有的数据。那么将节省很大一部分时间。
索引的优势和劣势
优势: 索引就像书本的目录 使查找更容易方便 提高 数据检索效率,降低数据库的成本
@:有效的提高检索效率,最终还是为了减少对io的读取
通过索引对数据库进行排序,降低数据排序的成本,降低 cpu 的消耗
@:索引是排好序的数据结构,但是他也是需要运算成本的,会消耗一定的系统资源
但是不用索引数据量多得话或消耗更多的资源,减少了多电脑cpu的消耗
劣势: 实际上索引也是一张表,改表保存了主键 与索引字段,并指向实体表的记录,所以索列也
是要占空间的。
虽然索引大大提高了 查询的速度,同时却会降低更新表的速度, 如果对 表 进行 insert ,
update delete 整个数据结构和索引都会跟着更新,

使用索引注意:
1:如果数据频繁更新的话就不适合使用索引
2:那些根本就不会作为where条件后的那些字段
4:表数据很少的时候不适合使用索引什么时候适合建索引和以上条件相反的时候就适
合建索引
5: 过多的索引的的索引和不适合的索引 都不是好事 会增加io的成本

mysql 是存在磁盘里的
mysql 的索引是缓存在磁盘里的数据
N磁盘 取数据 ---->到内存
磁盘 也就是
在这里插入图片描述

索引的分类:

单值索引:既一个索引只包含单个列,一个表可有多个单列索引。
(1:每个索引只包含一列
2:每个表中可以有多个单列索引,但他们不是组合索引)
普通索引
特点:1,允许定义索引的列中有空值和重复值
2:没有指定的关键字 默认使用的就是普通索引
语法: create index 索引名称 on 表名称(字段名称)
删除索引的语法
drop index 索引名称 on 表名称
唯一索引:索引的值必须保证唯一,但允许有空值 。
特点:有索引的属性的值不能出现重复的值
语法: crate index unque 索引名称 on 表名称(字段名称)
主键索引
数据库默认使用innodb引擎 也就是说当你创建主键的时候数据库会默认的把你的
主键设置为主键索引
复合索引:一个索引包含多个列 INDEX Multildx( id name age)
比如说有一学生表 经常的把学生表的name和 年龄作为条件去进行查询的话
就可以把name和age这两个字段 创建一个复合索引
语法 create index 索引名称 on 表名称(字段名称,字段名称)
复合索引多个列组成大的索引
注意:复合索引要遵循最左原则 也就是最佳左前缀法则(带头索引不能死,中间
的索引不能断)
全文索引:只有在MylSAM 引擎上才能使用 ,只能在C HAR ,VARCHAR ,TEXT 类型 字段上使用全文
索引

组合索引:(特点:用户可以在多个列上建立索引,复合索引在数据库操作期间所需的开销会更小,
可以代替多个单一索引)
空间索引: 空间索引是对空间数据类型的字段上建立的 索引

索引类型:

在这里插入图片描述 mysql的用的是 BTREE: 是B+TREE

哈希表:

哈希表(hash table 也叫散列表)是根据关键码值(key ,value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射 到表中一个位置来访问记录,以加快查找 的速度。这个映射函数叫做散列函数 存放记录的数组叫做散列表。
哈希表hash table(key ,value) 的做法其实很简单,就是把key通过一个固定的算法函数既 所谓的哈希函数转换成一个整型的数字,然后就将该数字对数组长度进行取余 取余结果就当作数组的下标 将value存储在以该数字为标的数组空间里。
而当使用哈希表进行查询的时候。就是再次使用key转换对应的数组下标,并定位改空间获取value 如此一来 就可以充分利用数组的定位性能进行数据定位
在这里插入图片描述优点:查找可以直接key进行查找 查找效率高
缺点:不能进行范围查找 而且只 支持MEMORY

二叉树:

二叉树 (Binary Search Tree , 简称BST)一颗相对平衡的有序二叉树,对其进行插入,查找,删除等操作 ,平均复杂度为O(logn)。
它的左子节点的值比父节点的值要小,右节点的值要比父节点的值大。
在这里插入图片描述
在这里插入图片描述
缺点: 是不平衡

红黑树:

在这里插入图片描述
在这里插入图片描述
缺点: 还是会左轻 不 平衡

B+树:

BTREE

B+树,这里的 B 表示 balance(平衡的意思) ,B+ 树是一种多路;自平衡的搜索树
它类似普通的平衡二叉树。
真实的数据存在于叶子节点;非叶子节点 只不存储真实的数据,只存储指引搜索方向的数据项。
在这里插入图片描述B树 或者B+树 中的节点为一页或页的倍数大小比较合适
一个好的索引结构, 在使用它的过程中要有尽量少的磁盘I/o操作
在这里插入图片描述
优点:
1:非叶子节点不存储数据, 叶子节点存储数据,一个非叶子节点内能存储更多的索引key,树的度变大 ,I/O效率更大
2:叶子节点有指向相邻 叶子节点的指针,提高了范围查找的效率

实现原理图B+树 (…):https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

Mysql中的索引原理

索引属于存储引擎级别的 的概念,这里分析的是MyISaM和innodb
在这里插入图片描述

MylsAM索引

在这里插入图片描述
总结:
mylsAM中索引检索的算发为首先按照B+Tree 搜索算发搜索 索引,如果指定的key存在,则取出其他data的值 ,然后以data的值为地址 读取相应数据记录

innoDB中的索引实现:
在innoDB中 表数据文件本身就是按B+Tree组织的一个索引结构, 这颗树的叶节点data保存了完整的数据记录。
在这里插入图片描述
在这里插入图片描述
聚集索引是指 数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同。一个表只能有一个聚集索引,因为一个表的物理顺序只有一种情况,所以,对应的聚集索引只能有一个,如果某索引不是聚集索引,则表中的行物理顺序与索引顺序不匹配,与非聚集索引相同,聚集索引有着更快的检索速度

总结:
首先检索辅助 索引获得主键,然后用主键到主键索引中检索获得 记录
非聚集索引: (myisam 存储引擎的索引数据结构)
就是索引和数据是分开的就是非聚集索引
聚集索引: (innodb 存储引擎的索引的数据结构)
*.ibd 文件 存放的表和数据,
*.frm 文件 是表结构,
就是数据和索引是在一块的就是聚集索引。
特性:
1:默认会拿主键去做索引,
2:如果没有主键会拿一个非空的并且是唯一索引 来做聚集索引,
3:如果以上没有 innodb 会自己维护一个id作为聚集索引。

那些情况需要添加索引:

在这里插入图片描述

什么情况不适合索引:

在这里插入图片描述
索引 案例:
给id 添上主键就是一个 mysql 会默认添加上一个唯一的索引。
给字段 加索引:mimaindex
在这里插入图片描述
在这里插入图片描述

create  index   indexName  ON  t_user(user_cod(20));
          --   indexName  创建索引名字
          --    t_user  给那个表加索引
          --    user_cod(20)  给那个字段加  长度是多少 

在这里插入图片描述
在这里插入图片描述

特别的查询会导致索引失效 注意事项:

1 :全值匹配最好
2:最佳左前缀法则(带头索引不能死,中间的索引不能断)
如果索引多个列,要遵守最佳左前缀法则。指的是查询从索引的最左前列开始 并且
不跳过索引中的列
3:不要在索引上做任何 操作(计算,函数, 自动/手动类型的转换)不然会导致索引失效而向全表扫描。
4:MYSQL 储存的引擎不能继续使用索引中范围条件(bettween ,< ,> in 等)右边的列
5:尽量使用覆盖索引(只查询索引的列 (索引列和查询列一致))。减少select
6:索引字段上使用(!= 或者 <>) 判断时,会导致索引失效而转向 全表扫描。
7:索引字段上使用 is null/ is not null 判断时,会导致索引失效而转向全表扫描。
8:索引字段使用like以通配符开头(’%字符串‘)时,会导致索引失效而转向全表扫描
由结果可知like 以通配符结束相当与范围 查找,索引不会失效,与范围条件(bettwween ,< > in 等) 不同的是不会导致右边的 索引消失。
9:索引字段时字符串 但查询时 不加单引号 ,会导致索引失效 而扫描全表
10:索引字段使用or 时,会导致索引失效 而扫描全盘。

评论 67
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

  T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值