在需求中由于要批量查数据,且表中数据量挺大(2300万条记录) 且查询条件的这两个字段没有加索引,为了增加查询速度,现在需要去为这两个字段添加索引。
刚开始加索引想到的问题:

  1. 是否适合添加索引
    我们都知道,添加索引都会降低插入和update的效率,现在由于这个是用户表所以说是数据update是不频繁的。 所以是可以加的
  2. 这个作引应该怎么加
    由于每个字段的大小是256 所以说这个索引树建下来还是很浪费存储的,于是考虑前缀索引,和复合索引。 由于前缀索引的话这两个字段并不是有规律可寻的所以说加了的话 这玩意会增加扫描的行数的。 然后算了就加复合索引吧。
  3. 既然创建复合索引那么我们如何去吧那个索引放在前面呢?
    有时看了一下规律,是这样的他有一个字段区分度还是很低的 所以说吧区分度低的放在后面区分度高的放在前面。 由于联合索引的是先以 前面的排序在根据后面的排序所以说将区分度高的放在前面会减少扫描行数增加查询效率
    但是最重要的问题来了,我就要提交SQL的时候 leader 问了一句我,你这边的话这个数据字段 默认值为null? 我说是的默认值为 null(按照规定这玩意是不能null 的 应该 not null的,但是是历史数据 我这变也没改(其实这两个字段也是我之前实习的时候加的)),于是她说这样的话索引会失效, 于是我就在想为什么啊。
    B+树 不能存储为null值的字段吗。想想也是啊 为null 值这个key 怎么建立啊,怎么进行区分呢? 于是带着疑问去查了查,
    在innodb引擎是可以在为null的列里创建索引的,并且在当条件为is null 的时候也是会走索引的。 所以说这个null值一定是加到B+ 树里面了 但是这个就会哟疑问了 索引的key值为null值在B+树是怎么存储着呢 ??? 后面继续补 下 面是复合索引创建规则和排序情况