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