mysql 索引(小白上手指南)_数据

1)什么是索引?

  索引就是帮助MySQL高效获取数据的一种【数据结构】。索引是一种树结构,MySQL中一般用的是【B+树】。

2)索引图示说明(这里用二叉树来帮助我们理解索引)

  树形结构的特点是:子元素比父元素小的,放在左侧;子元素比父元素大的,放在右侧。

这个图示只是为了帮我们简单理解索引的,真实的关于【B+树】的说明,我们会在下面进行说明。

mysql 索引(小白上手指南)_字段_02

 

  索引是怎么查找数据的呢?两个字【指向】,上图中我们给age列指定了一个索引,即类似于右侧的这种树形结构。mysql表中的每一行记录都有一个硬件地址,例如索引中的age=50,指向的就是源表中该行的标识符(“硬件地址”)。也就是说,树形索引建立了与源表中每行记录硬件地址的映射关系,当你指定了某个索引,这种映射关系也就建成了,这就是为什么我们可以通过索引快速定位源表中记录的原因。

  以【select * from student where age=33】查询语句为例。当我们不加索引的时候,会从上到下扫描源表,当扫描到第5行的时候,找到了我们想要找到了元素,一共是查询了5次。当添加了索引以后,就直接在树形结构中进行查找,33比50小,就从左侧查询到了23,33大于23,就又查询到了右侧,这下找到了33,整个索引结束,一共进行了3次查找。是不是很方便,假如我们此时需要查找age=62,你再想想“添加索引”前后,查找次数的变化情况。

3)MySQL中索引使用的就是B+树结构。

mysql 索引(小白上手指南)_mysql_03

 

首先,Btree一般指的都是【B+树】,数据全部存放在叶子节点中。对于上图来说,最下面的第3层,属于叶子节点,真实数据部份都是存放在叶子节点当中的。那么对于第1、2层中的数据又是干嘛的呢?答:用于分割指针块儿的,比如说小于26的找P1,介于26-30之间的找P2,大于30的找P3。

其次,三层【B+树】可以存放上百万条数据。这么多数据怎么放的呢?增加“节点数”。图中我们只有三个节点。

最后,【B+树】中查询任意数据的次数,都是n次,n表示的是【B+树】的高度。

 2、mysql的编写过程和解析过程

1)编写过程

select dinstinct  ..from  ..join ..on ..where ..group by ..having ..order by

2)解析过程

from .. on.. join ..where ..group by ..having ..select dinstinct ..order by

3、索引的弊端

1)当数据量很大的时候,索引也会很大(当然相比于源表来说,还是相当小的),也需要存放在内存/硬盘中(通常存放在硬盘中),占据一定的内存空间/物理空间。

2)索引并不适用于所有情况:

  • 少量数据;
  • 频繁进行改动的字段,不适合做索引;
  • 很少使用的字段,不需要加索引;

3)索引会提高数据查询效率,但是会降低“增、删、改”的效率。当不使用索引的时候,我们进行数据的增删改,只需要操作源表即可,但是当我们添加索引后,不仅需要修改源表,也需要再次修改索引,很麻烦。尽管是这样,添加索引还是很划算的,因为我们大多数使用的就是查询,“查询”对于程序的性能影响是很大的。

4、索引的优势

1)提高查询效率(降低了IO使用率)。当创建了索引后,查询次数减少了。

2)降低CPU使用率。比如说【…order by age desc】这样一个操作,当不加索引,会把源表加载到内存中做一个排序操作,极大的消耗了资源。但是使用了索引以后,第一索引本身就小一些,第二索引本身就是排好序的,左边数据最小,右边数据最大。

5、索引分类

1)单值索引

利用表中的某一个字段创建单值索引。一张表中往往有多个字段,也就是说每一列其实都可以创建一个索引,这个根据我们实际需求来进行创建。还需要注意的一点就是,一张表可以创建多个“单值索引”。 

假如某一张表既有age字段,又有name字段,我们可以分别对age、name创建一个单值索引,这样一张表就有了两个单值索引。

2)唯一索引

也是利用表中的某一个字段创建单值索引,与单值索引不同的是:创建唯一索引的字段中的数据,不能有重复值。像age肯定有很多人的年龄相同,像name肯定有些人是重名的,因此都不适合创建“唯一索引”。像编号id、学号sid,对于每个人都不一样,因此可以用于创建唯一索引。

3)复合索引

多个列共同构成的索引。比如说我们创建这样一个“复合索引”(name,age),先利用name进行索引查询,当name相同的时候,我们利用age再进行一次筛选。注意:复合索引的字段并不是非要都用完,当我们利用name字段索引出我们想要的结果以后,就不需要再使用age进行再次筛选了。

6、创建索引

  • 创建单值索引
create index dept_index on
  • 创建唯一索引:这里我们假定name字段中的值都是唯一的
create unique index name_index on
  • 创建复合索引
create index dept_name_index on

另外一种的添加索引方式

  • 建单值索引
alter table tb add index
  • 创建唯一索引:这里我们假定name字段中的值都是唯一的
alter table tb add unique index
  • 创建复合索引
alter table tb add index

7、删除索引和查询索引

1)索引删除

语法:drop index 索引名 on 表名;

drop index name_index on

2)索引查询

语法:show index from 表名;

index from

 

 作者:Syw

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

如果文中有什么错误,欢迎指出。以免更多的人被误导。