在mysql中,建立索引的时候一般可选的索引类型有
普通索引(Normal),最基本的索引,没有任何限制
唯一索引(Unique),索引列的值必须唯一,但允许有空值,
全文索引(FullText),效果类似like,但是比like效率高,多用于大文本字段的检索。
还有一个主键索引,默认建表指定了主键就自动创建了主键索引,主键索引跟唯一索引的区别就是主键索引不允许为空
聚集索引
是指数据库表行中数据的物理顺序与键值索引顺序相同。一个表只能有一个聚集索引,因为一个表的物理顺序只有一种情况。可以这样认为,主键索引就是聚集索引,因为一个表只能有一个主键,而且在B+树中,肯定是存在一个主键的,即使建表的时候不指定主键,它就会找到第一个不为空并且所有值唯一的列作为主键去创建索引,如果都不合适,innodb也会默认给一个主键rowid,而所有数据都是存在叶子节点中,而叶子节点存放的数据是跟主键一致的。
辅助索引
除了主键索引外其他的索引称之为辅助索引,比如说下面以name为栏位创建的索引就是辅助索引,辅助索引也有一棵自己的B+树,也是存在ibd文件中,但是跟主键索引又有点不同,它的叶子节点存放的是主键的id跟name的值,整个搜索过程分为两步走,第一步查询where name = ‘jack’,第二步根据name=jack对应的主键id去聚集索引树找到对应id的完整数据,辅助索引会多扫描一棵B+树,所以效率肯定比主键索引低,这种情况又称之为回表
覆盖索引
覆盖索引是指从辅助索引中就可以直接查找到结果,而不需要再走一遍主键索引的情况,比如select name from user where name = ‘jack’,这种情况在辅助索引的树中就已经拿到了jack,这时候不需要再进行一次回表了。减少了磁盘的IO
离散度
我们一般创建索引的时候会考虑一个离散度问题,所谓的离散度就是指列的数据重复程度,比如说性别,不是男就是女,这样的列就不适合创建索引,因为这样创建的索引树左右子树都是一样了,去查询的时候innodb也不知道走左边还是走右边,这样还不如全表扫描,这样导致的结果很可能就是索引不生效
联合索引
联合索引是指一次同时创建两个或以上的列作为索引,联合索引遵循最左匹配原则,对比的时候先对比最左边的值,如果最左边的值相同才会对比右边的,走索引的情况是要包含最左边的那个值,这里如果phone和name在前或者后都会走索引,因为OPTIMIZE优化器会自动调整顺序使之符合最左匹配原则,如果查询条件只是phone则不会走索引。
like前面带%的情况也不会走索引,因为这也违反了最左匹配原则,因为最左匹配就是从最左边第一个字母对比的,而左边带了百分号就是说最左边可能还有别的字母加入。