002-MySQL数据库索引

Java知识点总结系列目录

1. MySQL索引数据结构以及各自特点

  • 二叉树
    左子节点小于父节点,右子节点大等于父节点。

    当索引为已排序数据时,导致二叉树变成了链表,查找复杂度为N

    每个节点只存储一个记录,数据量大时树高度比较大,查找困难;每个节点只存储一个记录,导致一次查询有可能多次磁盘

  • 红黑树
    自平衡二叉查找树。左右子树的高度相差较大时,自动旋转平衡,树的高度相对于二叉树小一点

  • Hash表
    优点在于:在确定值的情况下,对于读写定位都很快

    缺点在于:区间范围查找困难,比如>, <, between 等,order by和group by也很困难

  • B-Tree
    B-Tree结构
    一个节点包含多个索引,这样树的高度可控。节点大小有限制;可通过show global status like 'innodb_page_size'; 查看节点的大小,一般为16KB。

  • B+Tree
    B+Tree结构
    叶子节点从左到右递增。B+Tree中叶子节点增加了指针连接,在范围查找时非常方便,比如选取大于30的记录,顺着叶子节点向右的指针就可以查找出所有符合的记录,而不用再从根节点一次遍历查找

2. MySQL数据表存储引擎

  • InnoDB存储引擎
    InnoDB存储引擎索引实现
    InnoDB存储引擎存储的表主键索引的叶子节点存储的数据记录本身,索引和数据都在B+Tree上,为聚集索引类型。

    数据是以索引的结构组织在一起的,所以InnoDB存储引擎的表必须要有主键,如果没有显示的设置主键,系统自动选取一个具有唯一值的列作为主键,选不到时创建一个辅助的具有唯一值的列作为主键进行自动维护。

    整型的自增型主键好处在于,第一整型存储较小,第二在于数据的插入和查询效率较高

    非聚集类索引叶子节点数据部分存储的是主键,所以使用非聚集索引检索数据时需要查找两次,先在当前索引树上找到主键,再通过主键在主键聚集索引树上找到对应的数据记录

  • MyISAM存储引擎
    MyISAM存储引擎索引实现
    MyISAM存储引擎存储的表叶子节点存储的数据是对应的记录的磁盘地址,索引文件和数据文件分离,为非聚集索引类型

3. 聚集索引和非聚集索引

  • 聚集索引
    数据存储在索引树上。索引的逻辑顺序和数据的物理顺序一致

    一张表只能有一个聚集索引。InnoDB将主键与数据聚集在一起的方式,使得按主键顺序的插入和查询效率会很高,更新主键或者不按主键的顺序插入数据的代价会比较高

  • 非聚集索引
    数据不存储在索引树上,只存储数据的指向指针。索引的逻辑顺序和数据的物理顺序不同

    一张表可有多个非聚集索引,叶子节点数据部分存储对应的主键值

  • 使用场景

动作描述 使用聚集索引 使用非聚集索引
列经常被分组排序
返回某范围内的数据 不应
一个或极少不同值 不应 不应
小数目的不同值 不应
大数目的不同值 不应
频繁更新的列 不应
外键列
主键列
频繁修改索引列 不应

4. 联合索引

  • 概述
    1、两个或更多个列上的索引被称作联合索引,联合索引又叫复合索引。

    2、对于复合索引:MySQL从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3种组合进行查找,但不支持 b,c进行查找 . a,c组合也可以,但实际上只用到了a的索引,c并没有用到! 当最左侧字段是常量引用时,索引就十分有效。where条件中and的顺序MySQL会自动调整,所以and的顺序不一定非要按照abc的顺序

  • 规则

    1、 需要加索引的字段,要在where条件中

    2、数据量少的字段不需要加索引

    3、如果where条件中是OR关系,加索引不起作用(InnoDB存储引擎)

    4、符合最左原则,使用最频繁的一列放在最左边

    5、列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL

    6、联合索引比对每个列分别建索引更有优势,因为索引建立得越多就越占磁盘空间,在更新数据的时候速度会更慢

5. Explain查看索引使用情况

  • explain结果个字段表述的意义请参考
    https://www.cnblogs.com/DreamDrive/p/7752960.html

  • key_len是一个很重要的参数,它的长度可以计算出当前SQL语句使用了哪些索引,计算方法请参考
    https://www.cnblogs.com/xuanzhi201111/p/4554769.html

MySQL索引专题可参考(高大全)
https://www.cnblogs.com/softidea/archive/2016/08/29/5816497.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章