索引
索引实质是一种数据结构,目标是为了进步数据查问的效率,尽可能减少 IO 次数。
- 大大减少服务器须要扫描的数据量
- 帮忙服务器 缩小排序过程 和防止生成长期表
- 能够把 随机 IO 转变为 程序 IO
无效应用索引会大大 晋升查问效率 ,但会减少 磁盘空间 和升高 插入效率
常见的索引类型
哈希索引
哈希索引(Hash Index)是基于哈希表实现,是一种键值对(Key-Value)存储的数据结构;
长处:等值查问 效率较高
毛病:范畴查问 效率较低,须要一个一个查找
MySQL 中只有 Memory 引擎显示反对哈希索引,也是其默认索引类型
有序数组
有序数组的元素是递增或递加的,能够通过二分算法,在 log(n) 工夫复杂度查到对应元素
长处:范畴查问 效率较高
毛病:减少新元素速度较慢,须要拷贝数组
树形索引
二叉树, 红黑树, B Tree, B+Tree 等
高性能索引策略
图片来自《高性能 MySQL 第三版》
聚簇索引
聚簇索引中索引即数据,数据行 寄存在索引的叶子节点中
因数据行在磁盘中只寄存了一份,因而一个表只有一个聚簇索引
如果表中没定义主键,InnoDB 会抉择一个惟一的非空索引代替,如果没有非空索引则会隐式创立一个 6 字节大小的指针作为主键,同时也会成为聚簇索引
非聚簇索引
非聚簇索引也称为二级索引,索引的叶子节点中寄存的是 主键的值
当应用因为非聚簇索引查问时,因为非聚簇索引叶子节点中寄存的是主键的值,当查到主键的值后,须要依据主键再查到对应的 数据行 ,这一过程叫做 回表
基于非聚簇索引的查问须要多扫描一棵索引树。因而,咱们在利用中应该尽量应用主键查问
多列索引
建设多列索引,数据会保留在索引树的节点上,能够利用 笼罩索引 准则,缩小回表
多列索引的索引项是依照索引定义外面呈现的字段程序排序的
笼罩索引
当应用二级索引查问时,如果查问的内容保留在索引树上,则间接返回保留再索引数树的数据即可,不须要再回表查问
最左前缀
B+ 树这种索引构造,能够利用索引的最左前缀,来定位记录
如果在 (name,age) 列上建设了索引,依据最左前缀,查问 name 也会走索引,从而能够缩小保护索引个数
只有满足最左前缀,就能够利用索引来减速检索。最左前缀能够是联结索引的最左 N 个字段,也能够是字符串索引的最左 M 个字符
like aa%
后含糊查问索引无效,like %aa
含糊查问索引有效
索引下推
MySQL 5.6 引入的索引下推优化(index condition pushdown),能够在索引遍历过程中,对索引中蕴含的字段先做判断(where 条件里的匹配),间接过滤掉不满足条件的记录,缩小回表次数
在 仅能利用最左前缀索的场景 下(而不是能利用全副联结索引),对不在最左前缀索引中的其余联结索引字段加以利用
explain
输入的 Extra
字段中会有 Using index condition;
即代表本次查问会利用到索引,且会利用到索引下推