看了一些MySQL索引方面的东西,这里做一下小结一下(还是怕自己忘了)。涉及的是Innodb引擎以及B+树,如果有误,请各位大佬指出。
聚簇索引
这个东西是根据主键索引形成的一种数据存储方式 。
没有主键咋办呀?不慌,看一下有没有非空唯一索引;
有好几个非空唯一索引可咋办?照样不慌,Innodb自动选择你在创建表的时候第一个非空唯一索引作为主键。
那要是也没有非空唯一索引咋办?那就不用管了,InnoDB会给你隐式定义一个主键作为聚簇索引。
简单来说就是非叶节点是主键的值,叶节点指向的是数据表中每一行的数据,回想一下B+树,那肯定都知道叶子节点都是按顺序来排列的,所以大家肯定在一个表中找不到第二个聚簇索引了。
问题来了:我要是不用主键查找,那聚簇索引岂不是用不了了?
放心,不能浪费。。。我们阔以建立其他索引,比如说非聚簇索引(又称二级索引)。
非聚簇索引(二级索引)
假如我们给某几个字段建了个索引,现在要用它来查找我们需要的数据,咋办呢?来一个非聚簇索引呗,和聚簇索引不同的是叶子节点只保存了主键值,但是聚簇索引叶子节点保存的可是整整一行数据。
嗯?我要主键值干哈,我要去找我要的数据。
能找到,不慌哈。
现在聚簇索引又要登场了,所有人都已经猜到,我阔以用这个主键值在聚簇索引中进行查找(这里也叫做回表),找到叶子节点,那里有我要找的数据,一行数据都在那里呢,想用哪个字段用哪个字段, 开心。(估计二级索引这个名字也就是这么来的,找两次索引)。
覆盖索引
好麻烦,还要找两次索引,有木有简单的一个啥索引,我一次就能找到?
有有有,知道不知道覆盖索引呢,简单来说就是select选择的字段恰好包括在我的索引字段中了,美滋滋。你找的字段都在我的索引字段中,那你还在二级索引中回什么表,这里就有你要找的字段哇。一次 性找到,是不是挺好,所以嘞,以后建立索引的时候多想想,尽量把你select中的字段包括进去。
推荐初学的,像我一样的菜鸡看高性能MySQL,希望大佬们多赐教。