数据库常见的索引类型有:主键索引 唯一索引 普通索引 全文索引 组合索引
普通索引,最常见的索引
alter table table_name add index index_name (coumn_name);
唯一索引,索引列的值是唯一的,可以为null
alter table table_name add unique (colunm_name);
主键索引,设置主键的时候自动创建的索引,属于特殊的唯一索引.特殊在于不能为null
alter table table_name add primary key (column_name);
组合索引,给多个字段添加索引叫做组合索引
alter table table_name add index index_name (colunm1,colunm2...);
全文索引,只有char varchar text类型可以添加全文索引,全文索引用于搜锁一篇很长的文章时,效果很好,用在比较短的文本,可以使用普通的index;
alter table table_name add fulltext index_name (colunm_name);
使用全文索引
select * from student where match(name) against('梁')
优点:
缺点:
总结:
一般来说,创建索引的情况需要排除一下情况:
最左匹配原则,在使用联合索引之后,如果查询条件中包含联合索引中最左边的列,就会按照索引查询,再去匹配第二列,一直向右匹配,直到遇到范围查询的条件就会停止.如(< > between 等等)
假如我们现在给 a b c 建立联合索引,
alter table t1 add index un (a,b,c);
在给abc建立联合索引,会先给a列建立索引,之后在a的基础上建立b的索引,在次基础上建立c的索引.如果同时存在abc3个条件,比如 a=1 b=3 c=2,会先按照建立索引时的顺序(a,b,c)的最左边的索引,也就是a,进行查询,之后再使用第二列,也就是b,进行查询.一直到最右边的列为止.可以看一下下面的图(原理是b+树,但是这里考虑到新手友好,就没有用b+树的图,而是使用了较为日常的一种方式,excel的排序逻辑):
其实上面这个图的逻辑是很直观的
只要我们建立了联合索引,在查询条件中包含了联合索引中从最左侧索引开始的一部分索引,这部分索引就会生效.还是举个例子,比如我们现在的查询条件是a=1 b=2,c不在条件之内,按照索引建立的顺序,我们还是先根据a,筛选出一部分,再根据b查找出一部分.根据这个条件去筛选上面图中的数据,还剩3条,由于我们没有指定c的条件,所以会直接返回这3条数据
如果查询条件中包含了部分索引,但是不包含最左侧的索引,那整个联合索引都是不生效的.例如,我们现在的条件是b=2,c=2,这里我们没有指定a的值,所以无法确定我们b=2的查询范围.要知道,我们的索引是先建立的a,会先根据a的值进行排序,之后在a相同的数据中再用b排序,所以就可能就会出现,a=1的数据中存在b=2的数据,但是a=2的数据中也存在b=2的数据,但是这些数据的排列并没有规则,所以只能进行全表扫描,这样就相当于索引失效,同理,如果条件是a=1,c=3.那么索引a会生效,c是不生效的,原理一致.
一直向右匹配,直到遇到范围查询的条件就会停止.如(< > between 等等),了解了上一条机制,不包含最左侧的索引就会失效是因为我们筛选的数据在某种程度上是无序的,所以我们现在的查询条件是这样的,a=1,b>1,c=3.首先,a是生效的,这毫无疑问,b也生效,因为我们在经过a的筛选之后,b的排列也变的有序,但是c呢,我们根据b>1查出的会有多组数据.在这些数据里面,b=2的数据中.存在c=3,b=3的数据中也存在c=3,所以跟上面的机制一样,对于c来说又变成了无序,所以遇到范围查询的条件就会停止,a=1,b>1,c=3中a b生效,c无效
这就是最左匹配原则.