MySQL索引
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL索引,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4780字,纯文字阅读大概需要7分钟。
内容图文
![MySQL索引](/upload/InfoBanner/zyjiaocheng/867/61ad9f450966482ca13631f9ff113548.jpg)
MySQL索引理解(读懂此文章包你理解索引)
文章目录
前言
相信对于索引大家并不陌生,索引是一个庞大的知识体系,数据库、ES、文件索引、搜索引擎等等。
本篇文章将帮助你MySQL索引,希望会对很多人有所帮助。
废话不说,开撸。
提示:以下是本篇文章正文内容
一、索引是什么?
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。
简单的说就是为了加快数据访问。
1.索引设计
[外链图片转存失败,源站可能有防盗在这里插入!链机制,建描述]议将图片上https://传(imbo.csdnSmg.cn/20201223iTbz102533969.png?,type_ZmFuZ3pnaGVpdGk,shadow_W0,text_aHR0cHM6Ly9ibG9nLmNzZG5ubmV0L8FxXzQxNDg3NTM4,size_16,color_FFFFFF,t_70343)(https://img-b)]
数据存放在磁盘中,读取数据会把磁盘数据写入到内存中,从内存中读取数据这个操作就是IO,硬件上来讲换固态(满满的金钱),作为一名软件工程师我们能做的优化就是减少数据量,减少访问次数。甚至可以说能不能直接取到具体位置直接从磁盘获取对应数据,这就需要索引了。
一句话就是尽可能让其快速的定位到一行数据在磁盘或者文件中的位置。
那么问题来了如何快速定位呢?
很简单使用K-V就可以实现。
K:存放哪个文件,V:就是偏移量
二、MySQL为什么选用B+树?
key-value格式首先你会想到哈希表,见下图示例:
使用哈希会有几个问题:
1、hash会存在hash碰撞和hash冲突,需要设计比较好的hash算法。
2、对于内存比较依赖。
3、不支持范围查询,只能挨个对比。
(但是MySQL中是存在hash索引的,适用于memory这样的存储引擎,而且innodb存储引擎支持自适应hash)
而数据库是属于联机事务处理,要求支持业务场景,在最短时间内返回对应数据,所以显然可以支持范围查询更好,支持范围查询那就要有序,因此选用二叉树。
左叶<根<右叶,这样在检索时候如果值大于根节点那么找右边就行,小于就找左边实现了二分查找。
对于二叉树又有如下几种二叉树:
BST树:如果插入数据一直递增或者递减,那么依据二叉树规则就会变成只有右边或者只有左边,那就有可能退化成链表了,又需要挨个对比查询。
AVL树(严格):二叉平衡树,在进行插入时候会进行旋转操作,保证左右两棵树尽可能平衡,平衡的规则是左子树跟右子树高度差不能超过1。
但是在插入的时候会进行N次旋转,会导致插入性能降低以此来换取查询速度的高效。
红黑树(非严格):也是一种二叉平衡树,但是平衡规则是最长子树只要不超过最短子树的2倍即可。
随着数据得插入,树会越来越深,io次数会逐渐增多。
B树与B+树都是矮胖的,比如四阶B树一个节点可以包含最多3个值,超出会分裂产生新得根节点,两者的区别就是B+树中叶子节点包含所有值,而B树每个节点都有值所有节点组成一个树。
下面为演示图方便大家理解:
4阶B树:
B+树图如下:
B树适合磁盘跟内存交互的应用场景的数据读取,大部分索引使用的都是B树完成的。
方便理解的动态树生成演示网站:
二叉树演示
三、对于索引相关问题的理解
这一章主要是想帮助大家更好的理解索引的问题概念。
继续撸:
1.一个表中可以有多少个索引?
答案:N个。
2.如果有多个索引的话,那么数据存储几份?
答案:数据只存储一份,不会有大量的数据冗余存在。
3.如果只存一份数据那么其他索引如何查找数据呢?
答案:在进行数据插入时,必须要跟某一个索引列相关联存储的,索引列的选择依托于下面顺序,有主键,用主键,没有主键,用唯一键,没有唯一键用6字节的row_id代替。
其他索引的叶子节点不会存储数据了,而是存放跟数据绑定的索引的key。
案例:
假设,表中有id,name,age三个列,id是主键,name是普通索引。
select * from table where name = zhangsan;
查询过程如下:先根据name的值去name的B+树上读取id,再根据id去主键的B+树上读取整行的记录,这个过程叫做回表
回表:当查询数据的时候需要聚簇索引获取整行记录的过程。
select id,name from table where name=zhangsan;
查询过程如下:直接根据name的值去name的B+树上获取所有查询的列值过程称为索引覆盖
索引覆盖:在索引叶子节点中能获取到查询的所有字段,此时叫做索引覆盖。
例子:
id,name,age,gender
id是主键,(name,age)是组合索引
select * from table where name=?
select * from table where name=? and age=?
select * from table where age=?
select * from table where age=? and name=?
最左匹配表示从左向后开始进行数据查询,1,2,4会使用组合索引,在mysql会有优化器来对条件的执行顺序来进行调整因此4也会使用组合索引。
最左匹配:在某些应用场景中需要两个key或者多个key共同在组成索引的key。
例子:
select * from table where name = ? and age=?
没有索引下推之前,是这样执行的:
先根据name的值去磁盘(存储引擎)中获取对应数据行记录,将符合条件的数据加载到server层中,在server中根据age进行数据筛选。
能不能在存储引擎中直接根据name和age进行筛选。
根据name和age的值在存储引擎进行数据筛选,server层不做任何筛选操作这就是索引下推。
到这里可能会有人有疑问,聚簇索引是什么?
很简单只需要记住数据跟索引放再一起的就是聚簇索引。
到这里对于索引你是不是清晰了很多呢?那么请看如下演示:
建立表和索引:
然后查询发现结果:
这怎么用到索引了,这不是不符合最左匹配吗,但是确使用了组合索引。
这是因为表中所有列都有索引就会使用索引了。
所以要需要学习的还有很多,本文仅仅帮助理解,里面一些不熟悉的地方还请自行查询进行深入学习。
看到这里已经有很认真啦,奖励你一首歌:
这是本人第一次写文章,算是个学习笔记吧也希望可以帮助其他人,加油打工人
内容总结
以上是互联网集市为您收集整理的MySQL索引全部内容,希望文章能够帮你解决MySQL索引所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。