MySQL-索引

78 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

索引介绍

  • 索引是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制。
  • 一个字段可以添加一个索引,当然,也可以多个字段联合起来添加一个索引。
索引是需要排序的,并且这个所以的排序和TreeSet数据结构相同。
TreeSet(TreeMap)底层是一个自平衡的二叉树!在mysql当中索引是一个B-Tree数据结构。

遵循左小右大原则存放。采用中序遍历方式遍历取数据。
  • 在MySQL当中,主键上,以及unique字段上都会自动添加索引的

语法:

创建索引:
		mysql> create index emp_ename_index on emp(ename);
		给emp表的ename字段添加索引,起名:emp_ename_index
	
删除索引:
		mysql> drop index emp_ename_index on emp;
		将emp表上的emp_ename_index索引对象删除。
  • 索引是各种数据库进行优化的重要手段。优化的时候优先考虑的因素就是索引。

索引的使用场景

  • 数据量庞大(到底有多么庞大算庞大,这个需要测试,因为每一个硬件环境不同)

  • 该字段经常出现在where的后面,以条件的形式存在,也就是说这个字段总是被扫描。

  • 该字段很少的DML(insert delete update)操作。(因为DML之后,索引需要重新排序。)

建议不要随意添加索引,因为索引也是需要维护的,太多的话反而会降低系统的性能。

索引的结构

索引的底层实现却有很多种,比如哈希表、有序数组、搜索树等,其实底层实现并没有最好之分,只有最合适的业务场景

索引的分类

而在InnoDB中,索引类型分为主键索引和非主键索引。

  • 主键索引的叶子节点存的是整行数据。在 InnoDB 里,主键索引也被称为聚簇索引
  • 非主键索引的叶子节点存的是主键的值。在 InnoDB 里,非主键索引也被称为二级索引或非聚簇索引

那么主键索引跟非主键索引有什么区别?

  • 主键索引的叶子结点存放的是行的数据
  • 二级索引的叶子结点存放的是该二级索引对应的ID值,如果此时查询的是行数据的话,我们可以凭借此ID值到主键索引再搜索一次,这个过程称为回表