Mysql索引

innodb引擎索引数据结构:B+树,原型为N叉树,在innodb中N大约为1200,树高为4时,大约可以存1200的3次方的数据,约为17亿(树根的数据块一般在内存中,10亿数据的表上查一个数值,只需要查三次磁盘,且树的第二层大概率也在内存中,访问磁盘的数量又有减少)

主键索引:整行数据存在叶子节点中,所以又叫聚簇索引

非主键索引:叶子节点存放的是对应主键的id,又叫二级索引或普通索引,

    回表:基于该索引的查询,还要根据叶子节点中的主键id,再查询一次主键索引。

索引维护:B+ 树为了维护索引的有序性,在插入新值的时候需要做必要的维护。

    页分裂:插入已有索引的中间位置时,需要移动后面的数据,空出位置,若要插入的数据页满了,则需要做页分裂,申请一个新的数据页,然后挪动部分数据过去,该过程除了影响数据库性能外,还影响数据页的利用率,原本放一个数据页的数据现在放在两个不满的数据页。

    页合并:相邻的两个数据页删除了数据,利用率很低后,会将两个数据页做合并,相当于页分裂的逆过程。

    主键选取:

        自增主键:自增主键每次插入新的数据都是追加操作,不会挪动其他数据,也就不会触发页分裂。整形数字做主键只占4个字节,长整形则是8个字节。

        业务逻辑主键:往往无法保证有序插入,写入成本较高。且其做主键时,其他二级索引叶子节点大小要视该主键长度大小而定,越大占空间越多。

            适用场景:只有一个索引;该索引是唯一索引

覆盖索引:针对普通二级索引,如select “主键ID” from table where ...,要查询的内容已经包含在该索引上了,不需要执行回表的操作,本质上减少树搜索的次数,显著提升查询性能。

联合索引:对一张表上的多个列建立索引,表上多个列加起来组成一个索引,供快速查询使用。

    最左前缀原则:使用前提,联合索引最左边的列必须作为过滤条件,否则联合索引就不会生效。例如索引(a,b),select *** from table where a == (like)*** and b == (like)*** ,select *** from table where a == (like)*** 这样才能生效,而select *** from table where b == (like)***则不会生效。最左前缀的原则可以是联合索引的最左N个字符,也可以是最左的M个字段。且建立联合索引以后,不会再为a单独建立索引,提高索引的复用能力。

    索引下推:MySQL5.6版本之后引入下推优化,可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤调不满足条件的记录,减少回表的次数。

 

posted @ 2022-11-23 14:00  夜雨声入眠  阅读(20)  评论(0编辑  收藏  举报