本篇文章主要讲述MySQL索引事务
所谓的索引index就是指:目录~~
索引存在的意义:加快查找的速度(省略了遍历的过程),但付出了一定的代价~
付出的代价如下:
1.需要付出额外的空间代价来保存索引数据 2.索引可能会拖慢新增,删除,修改数据的速度
但是,在总体来说,还是认为索引的利大于弊~~
在实际开发中,查询场景一般要比增删改频率高很多
查看索引:
show index from 表名;
创建索引:
create index 索引名 on 表名(列名); 索引名称可任意取
比如:把表中的内容,根据name搞了一份目录(索引)出来~
create index index_student_name on student(name);
创建索引的操作,可能很危险,如果表里的数据很大,这个建立索引的开销也会很大……,其实最好的做法就是:创表之初就把索引设定好了,如果表里已经有很多数据了,那么,索引就别动了~
删除索引:
drop index 索引名 on 表名;
删除索引和创建索引类似,删除索引也是有风险的~~
索引可以加快查询的速度,其实在索引背后的数据结构(查询)是B+树(为数据库索引量身定做的数据结构)~~B+树我们不做特别要求,但是对于B+树的特点与优势咋说咱也得知道点不??
B+树特点:
- 一个节点,可以存储N个key,N个key划分出了N个区间(而不是N+1个区间)
- 每个节点中的key的值都会在子节点中存在(同时该key是子节点的最大值)
- B+树的叶子节点,是首尾相连,类似于链表
- 由于叶子节点是完整的数据集合,只在叶子节点这里存储数据表的每一行数据,而非叶子节点,只保存key值本身即可
整个树的所有节点,都包含在叶子节点中(所有非叶子节点中的key最终都会出现在叶子节点中~~)
IO:input output------>输入输出 显示数据到显示器上,从键盘输入数据 把数据写到硬盘上,从硬盘上读数据 把数据写到网卡里,从网卡读数据。
B+ 树的优势:
- 当前一个节点保存更多的key,最终树的高度是相对更矮,查询时候减少了IO访问次数(和B树是一样的)(IO是指输入输出)
- 所有的查询最终都会落到叶子节点上(查询任何一个数据,经过的IO访问次数是一样的)
- B+树的所有叶子节点,构成链表,此时比较方便进行范围查询。
- 由于数据都是在叶子节点上,非叶子节点只存储key,导致非叶子节点,所占的空间是比较小的,这些非叶子节点就可以在内存中缓存(或者缓存一部分),又进一步减少了IO的次数。
在MySQL中组织数据的方式:
当年看到一张“表”的时候,实际上这个表不一定是按照“表格”这样的数据结构在硬盘上组织的,也有可能是按照这种树(B+树)形式组织(具体是哪种结构,取决于你的表里有没有索引,一级数据库使用了哪种索引~)
在一个表中:如果id是表的主键,若表里有多个索引呢??(id,name两个索引)表的数据还是按照id为主键,构建出B+树,通过叶子节点组织所有的数据行……,其次,针对name这一列会创建另外一个B+树,但是这个B+树的叶子节点就不再存储这一行的完整数据,而是存储主键id!!!此时,如果你根据name来查询,查到叶子节点得到的只是主键id,还需要通过主键id去主键的B+树里面在查找一次(一共查找两次B+树)(上述的过程称为“回表”,这个过程是MySQL自动完成的,用户感知不到~)