索引摘要

什么是索引?

索引:排好序的数据结构,索引的作用就相当于一本书的目录清单,根据页码快速查找到内容。

mySql中的索引类型

1.主键索引:mysql会在主键上建立一个索引,就是主键索引。主键索引有也是一种不为空的唯一索引。

2.复合索引:一个索引包含多个字段(复合索引的使用复合最左原则)

 create INDEX  idx_phone_name ON user(phone, name);

有任何复合索引中包含的任何一列出现都会走索引。

索引的数据结构

B+Tree:多叉平衡树,所有元素从左-右排好序的。

  非叶子节点不存data,只存索引,可以放更多索引

  叶子节点包含所有的索引和data,两个叶子节点间有双向索引

Hash索引:查询快,不需要磁盘io。

   不支持范围查询以及模糊查询(原因:hash索引比较的是Hash运算后的Hash值)。

  无法被用于避免数据的排序操作。

  不能用于部分索引键来查询。

  当数据量大的情况下,会存在大量Hash值相同的数据,此时用Hash查询的侠侣不一定比BTree快。

 为什么辅助索引不直接存数据的地址而存主键id?

 因为数据会不断的变化,地址也会不断的变化,存地址可能导致查询的数据不是想要的。

延伸:InnoDB存储类型,为什么提倡建立整形的自增主键呢?

  因为数据用B+Tree形式存储,如果没有主键索引,mySql会首先在所有数据中查找一列值全不一样的列作为唯一索引,如果找不到则默认加一列RowId,其实起的作用与自增主键一样,只是浪费了时间。字符串的比较是逐位的比较,整形占用空间比较小,且比较效率高。

为什么使用自增Id而不使用uuId或者身份证号作为索引呢?

自增id而不推荐使用uuid或者身份证号?

 B+Tree是自底向上插入,我们优先级将数据插入到叶子节点中,然后整棵树会根据叶子节点而变动。

 使用自增主键,我们叶子节点链表会根据当前最后一条的位置,将最新的一条数据顺序的插入到后面。

哪些列适合添加主键?

1.经常作为where条件的列

2.需要join连表的字段

3.经常需要order by和group by的字段

我们需不需要在性别上加索引呢?

不需要,识别度高的数据不需要加索引。在没有索引的情况下,mysql只需遍历底部的链表即可。但是加了索引以后他会查询index(gender)找到合法的索引的主键,然后通过主键再去index(id)里面去找这样一来一回效率自然就直线下降。

like '%张’一定不走索引吗?

不一定,给phone和name两个字段建立一个联合索引idx_phone_name,sql:select name from user where name like '%张' and phone = '15678945621';

这种情况下因为phone在索引第一位,所以无论有没有name这个条件都会走索引。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值