hi,你好!欢迎访问本站!登录
本站由网站地图腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 教程 - 杂谈 - 正文 君子好学,自强不息!

初识mysql索引 - 小白篇

2019-11-18杂谈搜奇网50°c
A+ A-

:打仗mysq也有两年摆布的时刻了,然则对该数据库的明白自认还比较低级,看过许多文章,也看过一些相干的书本,依旧小白。。。。(这里个人总结是两点主要缘由:1.对mysql的进修大部分都是源于看一些杂七杂八的文章,许多文章自身表述有误或不准确。2.实操较少,日常平凡增编削查索引的运用很通例,缺乏研讨精力 3.第三点也就是写这篇文章的主要目的,看到的东西常常是看了就看了,过一段时刻就忘记了,然后反复反复如许的阅历,时刻花的不少,然则如许永久不会对mysql体系控制,故而盘算经由过程文章把对mysql的明白落地,明白若干写若干,可以会东一点西一点比较乱,往后逐步完美吧)

 

对索引的熟悉:

什么是索引?

我最初的明白是把索引就地一本字典的目次。

假如一本字典没有目次,那我们想查到某个字只能重新找到尾。

所以才会对字典依据页码来举行分别,而且在字典的最最先几页,有响应的目次可以让我们晓得目的字在哪一页,从而疾速定位到目的。

而且依据需求的差别,平常用过字典的小伙伴都晓得,有依据拼音开首的目次,有依据偏旁部首开首的目次,等等。。。 实在和mysql中的 主键索引 团结索引 等等品种的索引是殊途同归的。

 

数据构造:

mysql索引运用的数据构造是B+树,现在大部分数据库体系都采纳 B+Tree 或 B-Tree 这两种数据构造,本文不盘算详解个中缘由(对两种数据构造细节感兴趣的可以参考其他文章)

简朴来讲,索引文件平常是存在于硬盘当中,因为数据量大没法悉数一次加载进内存。而磁盘的IO读取价值比拟于内存读取价值要高许多倍,所以我们在挑选数据构造上面,最主要的一点就是只管削减对磁盘io的操纵。

数组:索引文件没法一次加载进内存

链表:查询须要重新至尾的查询

上面的两种B树特性决议了他们可以保证只管少的举行io操纵,而且相对于均衡二叉树、二叉搜刮树等数据构造,树的高度要低许多,查询对应的io次数更少。

 

而B+Tree和B-Tree的区分主假如前者的非叶子节点不存储数据,目的是可以存储更多的索引,保证整颗树更“矮”,然则想要找到数据必需举行树的高度次IO操纵(即B+Tree的高度为3,则须要举行3次IO操纵,在叶子节点上找到目的数据)

而B-Tree不管叶子节点还黑白叶子节点都寄存数据,优点是可以在没有抵达叶子结点的时刻就找到了目的数据

然则B-Tree假如想要寄存和B+Tree相同量的索引,则必需让树的高度增添,也就是增添io次数,所以B+Tree相对更稳固

 

群集索引和非群集索引:

在mysql当中,差别的存储引擎对索引的完成是差别的,本文引见罕见的两种mysql存储存储引擎对索引的完成,即MyISAM存储引擎和InnoDB存储引擎,两者对索引的完成分别为非群集索引(非聚簇索引)和群集索引(非聚簇索引),这也是最罕见的两种索引的完成

1、MyISAM索引完成:

MyISAM引擎运用的黑白群集索引的情势,简朴来讲是索引和数据是离开寄存的,索引寄存的是数据文件的地点,我们须要先找到索引,然后再经由过程索引找到数据

MyISAM引擎中,主键和平常索引在构造上没有区分,只是主键必需是唯一的,然则在查询时,一般索引和主键索引都是须要先取得数据文件地点,再去找到响应的数据

 

2、InnoDB索引完成

该存储引擎运用的是群集索引,该索引体式格局最显著的特性就是主键索引和数据是在一起的(同一个文件中),可以明白为找到了主键索引也就找到了数据,不须要二次查找

而该索引构造当中的一般索引,想找到数据,也必需经由过程主键索引举行二次查找才可以

即:经由过程主键索引查找数据,查找一次 ,而经由过程一般索引查找数据,则须要一般索引找到主键索引,经由过程主键索引找到数据,也就是所谓的二次查找

如图为:mysql中两种索引体式格局的对照

 

 

 索引的运用战略,以及须要注重的点:

现在运用的存储引擎最多的就是InnoDB,我们的索引情势平常也为群集索引,也可以称之为主键索引,以下议论的索引运用战略基于该存储引擎

1、最左前缀道理:以团结索引举例比较轻易明白:平常来讲,团结索引即多个字段配合构成的索引,如 student表中:<stu_num, stu_age, date>学号 岁数  日期,三个字段竖立的团结索引

    我们在查询时一般来讲也必需依据竖立团结索引的递次来举行查找  如:

select * from student where stu_num = 1 and stu_age = 22 and date = '1993-11-11'; 

如许是可以充分利用团结索引的

然则因为mysql会在查询时对我们的sql语句举行优化 ,所以即便是我们写的递次是乱的,mysql依旧会把sql调解为准确递次 

select * from student where stu_age = 22 and stu_num = 1  and date = '1993-11-11'; 

假如我们只用团结索引当中的某个字段来查询时,只能用到团结索引的一部分

select * from student where stu_num = 1

然则假如我们用到的字段中心断开了,即缺乏中心的某个字段,则背面的data列的索引没法触发

select * from student where stu_num = 1 and date = '1993-11-11'; 

假如我们没有用到第一列的索引,则不会触发任何索引

select * from student where stu_age = 22 and date = '1993-11-11'; 

 

2、局限查询只能用到一次索引  

 

3、 在查询前提中含有表达式或许函数,则没法用到索引,来由很简朴,MySQL还没有智能到自动优化常量表达式的水平,因而在写查询语句时只管防止表达式出现在查询中,而是先手工私自代数运算,转换为无表达式的查询语句。

 

索引的挑选性:

在我们挑选某一列数据作为索引的时刻,有一个规范,称之为索引挑选性,所谓索引的挑选性(Selectivity),是指不反复的索引值(也叫基数,Cardinality)与表纪录数(#T)的比值

在这里我想浅显的解释一下。我们竖立索引的目的是要在查找的时刻只管的下降我们的搜刮局限。

比方student数据表中有10000条数据,存储50个班级的门生,

我们假如不必任何索引来查找一个门生,那我们须要定位的局限是10000条数据

我们经由过程学号这个唯一的字段作为索引,我们可以锁定该数据在某一行。

假如我们经由过程班级作为索引我们可以锁定该数据在200条数据之内

假如我们经由过程性别作为索引,(假定只要男女两种性别,而且男女比例1:1),我们可以锁定该数据在5000条数据局限内。

我们所说的挑选性表达的寄义就是如许,假如在捐躯了大批空间价值竖立的索引,在查找时只能将搜刮局限减少一半,那我们依旧须要遍历5000条数据,索引的意义也就不大。

故而我们在竖立索引时,须要只管的在查找时减少查询局限

 

是不是要挑选与营业无关的自增主键作为索引? 

 

在运用InnoDB存储引擎时,假如没有迥殊的须要,请永久运用一个与营业无关的自增字段作为主键。

 

常常看到有帖子或博客议论主键挑选题目,有人发起运用营业无关的自增主键,有人以为没有必要,完全可以运用如学号或身份证号这类唯一字段作为主键。不管支撑哪一种论点,大多数论据都是营业层面的。假如从数据库索引优化角度看,运用InnoDB引擎而不运用自增主键相对是一个蹩脚的主张。

 

 

上文议论过InnoDB的索引完成,InnoDB运用群集索引,数据纪录自身被存于主索引(一颗B+Tree)的叶子节点上。这就请求同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据纪录按主键递次寄存,因而每当有一条新的纪录插进去时,MySQL会依据其主键将其插进去恰当的节点和位置,假如页面到达装载因子(InnoDB默以为15/16),则拓荒一个新的页(节点)。

 

假如表运用自增主键,那末每次插进去新的纪录,纪录就会递次添加到当前索引节点的后续位置,当一页写满,就会自动拓荒一个新的页。如下图所示:

 

假如我们挑选一个身份证号或许学号之类的字段作为索引,则每次生成的主键是随机的,可以会有大批的叶子节点的裂变,同时保护索引的价值也大大增添

 

 

 

 

参考文献:http://blog.codinglabs.org/articles/theory-of-mysql-index.html

 

 

  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  移步手机端
初识mysql索引 - 小白篇

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
未定义标签

本文来源:搜奇网

本文地址:https://www.sou7.cn/282400.html

关注我们:微信搜索“搜奇网”添加我为好友

版权声明: 本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。请记住本站网址https://www.sou7.cn/搜奇网。

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>