乐趣区

关于mysql:MySQL-索引

索引

索引实质是一种数据结构,目标是为了进步数据查问的效率,尽可能减少 IO 次数。

  1. 大大减少服务器须要扫描的数据量
  2. 帮忙服务器 缩小排序过程 防止生成长期表
  3. 能够把 随机 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; 即代表本次查问会利用到索引,且会利用到索引下推

退出移动版