首先介绍一下MySQL的索引:
主流的索引也就分为两类:聚簇索引、非聚簇索引
其实还有什么哈希索引(不适合排序)、唯一索引(相同的插入不进来,保证索引的唯一性)
但是我们用的最多的也就是聚簇以及非聚簇了---这两个最大的区别也就是一个回表一个不回表
那我们再来说说索引的存储:别的文章已经写的很清楚了,就是一个B+树的数据结构,根节点存两个东西,一个是索引的值,一个是主键的值,通过索引找到了信息之后,再来个回表操作就可以查到我们想要的数据了
我们再来说说我们上面说的根节点,根节点存的是数据行信息还是数据页信息?
计算机数据都是以页来存储的,一页是4KB,根节点存的就是数据页信息,然后在通过二分法,找到数据行信息,再来回表。
说主题,MySQL在一个表上(这个表是有数据的),如果要新增索引都经历了什么?
个人分析:首先,一个表是已经建好了的,已经有数据了,我们知道,新增索引是要新建一个新的索引的B+树的数据结构的,那么我们新增这个索引,要先把新增索引的字段数据都查出来,然后根据这字段的数据信息再来构建一个新的B+树的数据结构。
那么是不是新增索引的时候要经过一下几步:
1.锁表
2.查处字段的数据信息
3.根据这个来建立一个新的索引
4.释放锁
其实这个锁,加个读锁就ok了,没有必要加写锁。
然后,再分析一下,给一个表加字段。
是不是跟索引的操作是一样的呀?就是原理不一样,这个原理是操作的回表的时候回到的主表,对主表进行的操作。原理完全不一样。但是步骤是一样的。
然后,再来说说删除索引有什么影响?
根据上面分析的,删除就是删除一个索引信息,直接删除就好,啥操作都不需要,直接干就完事。没有影响。
所以,不要轻易对大表,线上的表下手。若要下手,网上有对应教程。