MySql 索引

索引分类

  • 索引
  • 普通索引
  • 惟一索引
  • 复合索引
  • 聚集索引
  • 非聚集索引

inndb 聚集索引

  • test.frm
  • test.idb(data数据和index索引数据)

myisam 非聚焦索引

  • test.frm
  • test.myd data数据
  • test.myi index索引数据

查看索引

show index from table_name

创建索引

create [unique] index index_name on table_name(column_name(length));
alter table table_name add [unuque] index [index_name] on column_name(length);

删除索引

drop index [index_name] on table_name;

b+tree索引特点

  • 扫库、扫表能力更强
  • 只扫描叶子结点,不需要每次从根结点遍历
  • 叶子结点有序
  • 树的深度降低
  • 磁盘读写能力更强
  • 所有数据存放到叶子结点
  • 内结点存放指针、键值、IO深度降低
  • 排序能力更强
  • 叶子结点本身是有序的
  • 效率更新稳定
  • 数据存在叶子结点,存储磁盘地址,任意数据查询是相同次数的IO

b-tree与b+tree共同点

  • 物理一次索引查询IO,16K(show global status like 'Innodb_page_size')
  • 非叶子结点有data(磁盘指针)
  • 每一个结点的元素是自增的
  • 内在与IO的交互,以页为单位,一页4K,一次4页

b+tree(b-tree扩展)

  • 有b-tree的所有功能
  • 非叶子结点无data,所有data都在叶子结点
  • 且结子结点有序,每一个叶子结点都有序指向下一个和上一个叶子节点,双向指针
  • 度(每个节点的横向数量一般会超过100,高一般在3-5)

索引存储

  • mysiam存储主键索引与非主键索引原理一致,叶结点都保存的数据是文件指针
  • innoDB主键是索引叶结点是存储数据(叫聚集索引,索引和数据同时放在叶结点),非主键索引的叶结点是存储主键的指针(可以节省内存和一致性,两个索引数据不需要有两份)
  • 非聚焦索引,叶结点的索引和数据是分开存储的
  • 推荐使用自增主键(如整型、长整型等自增插入),不建议用uuid

uuid弊端有

  • 占用空间大
  • 查询速度比整理慢
  • 插入速度慢,在插入时,会新创建一个页的数据,自增的连接插入一个页后,且磁盘不需要寻道或需要寻道机率很小
  • 可能在中间插入,大概率每次插入都会创建一个页,或节点分列,索引和数据结点的移动

联合索引存储结构

  • 为什么不用红黑树
  • 数据量大的时候,深度也大,导致查询io过多

hash索引

  • 查询时间复杂度O(1)
  • 计算结果是无序的,排序不能索引

红黑树:

  • 一般用于内存索引

b+tree:

  • 一般磁盘存储索引
mysql索引 | suger 2020-09-29 06:16:22