数据库(MySQL):索引

1. 索引是什么

  • 索引是帮助MySQL高效获取数据的排好序的数据结构。

2. MySQL索引选择

  • 不使用二叉树的原因:易退化成链表。
  • 不使用红黑树的原因:红黑树高度不可控。高度低,查询效率高;高度高,磁盘IO次数太多,查询效率低。
  • 哈希索引:单记录查询时可用,性能最快。但不支持范围查询。
  • BTree索引:B树 -> B+树

B树:
a. 叶子结点具有相同的深度,叶子结点指针为空
b. 所有索引元素不重复
c. 结点中的索引从左到右递增排序
B+树(B树的变种):
a. 非叶子结点不存储数据,只存储索引(冗余),可以放更多的索引
b. 叶子结点包含所有索引字段
c. 叶子结点用指针连接,提高区间访问的性能
2
哈希索引:
2

3. MySQL两种引擎索引的实现方式

  • MyISAM表
    底层有三个文件:
    frm:存储表结构
    MYD:存储表数据
    MYI:存储表索引
    数据与索引是分开存储的,称其为非聚集索引(非聚簇索引、稀疏索引)
    查找过程:先判断查找条件是不是索引字段,是的话去MYI文件定位到B+树的相应节点,拿出记录对应磁盘地址,去MYD文件定位到索引对应的记录。
    2

  • InnoDB
    底层有两个文件:
    frm:存储表结构
    ibd:存储数据和索引
    聚集索引(聚簇索引)-叶子结点包含了完整的数据记录
    2
    相关问题:
    1) 为什么建议InnoDB表必须建主键,且推荐使用整型的自增主键?
    a. 如果不建主键,MySQL会自己悄悄增加一列做主键,MySQL性能会降低。
    b. 整型比大小,比字符串效率高;整型占用空间小(高速SSD,价格昂贵)。
    c. B+树叶子结点有序连接,若使用非自增,为保证其有序性,将数据插入某个位置,可能(16k满后)会导致结点分裂,效率降低。自增向后加元素,结点分裂可能性很低。
    2)主键索引与二级索引(普通索引/非主键索引,非聚集索引,数据部分只存主键)
    主键索引:
    2
    二级索引(普通索引/非主键索引):
    2
    3)索引最左前缀原理:用于联合索引结构,如("name", "age", "date"),不能跳过前面字段去用后面字段,原因:已从前向后排好序,只有前面字段相同,才会按后面字段排序。
    2

参考链接:
https://www.bilibili.com/video/BV19a4y1W7y8?p=1
JavaGuide(公众号)

posted @ 2021-09-03 09:56  aguo718  阅读(60)  评论(1编辑  收藏  举报