1, 什么是索引
如果我们要查找数据表中的一条数据,有一种方法是遍历整个表,一条一条的比较,最后查出我们需要的记录。当然这样做的效率很低,我们可以把数据库里面的数据根据某一列有顺序的排列,然后把这列分成几段,每段的边界信息存在另外的数据结构里面,然后查找的时候只需比较边界的值就可知道要查找的数据是否在这段里面,因为每段里面是排序的,所以就无需挨个比较,从而提高了效率。
2,索引的种类
从创建索引的角度,索引可以分为
直接索引和间接索引,使用create index index_name on table(column),语句创建的索引为直接索引,
当我们创建主键约束和唯一性约束的时候,数据库会自动为该列添加索引,故该索引成为间接索引。
从索引作用列的内容分
普通索引和唯一性索引
普通索引的列的值是可以重复的,唯一性索引的列的值可以为空,但是只要存在值就是唯一的。
从索引作用的列数来分
单个索引和复合索引
单个索引就是作用的列只有一列,
复合索引就是作用于多个列的索引。
聚集索引,
聚集索引不是单独的一个索引,而是存储方式,聚集索引的叶子节点存得是数据,而普通索引叶子节点存的是指向数据的指针
3,创建索引有几种方法
create index index_name on table_name(column)
也可以在创建表的时候指定主键,然后数据库引擎会为主键自动创建索引,
创建聚族索引,
create clusterd index indexName on table_name(column)
4,聚集索引与非聚集索引的区别
聚集索引,当将一列设为主键的时候,Mysql会自动将该列设置为聚集索引。当添加新的数据的时候,新数据在表中的位置会按照索引的逻辑来进行存储,这样查找的时候就会很方便,
当然了,建立索引会提高查找的速度,但是由于需要维护索引,所以插入和修改的效率就会降低。
4, 索引会失效的几种情况
在一下的情况,即便创建了index,index也不会起作用
(1) 如果列使用了不等于,!=
(2)如果有函数作用于索引列,day(column)
(3)使用like的列,如果类似这种形式,like 'abc%'就能使用索引,like'%abc'就不能使用索引
(4)索引列的排序,在where 中的列,如果有order by 将不会使用索引,
(4)如果是复合索引 index(column1,column2,column3) ,在where 子句中column1 ,column1 and column2 可以使用索引,如果是column3,column2 则不能使用索引
(5)索引不会包含null的值,如果列中包含null,则索引就会失效