转载自:https://blog.youkuaiyun.com/wu1226419614/article/details/64127569
主键使整个表变成了一个索引,也就是所谓的「聚集索引」
非聚集索引和聚集索引的区别在于, 通过聚集索引可以查到需要查找的数据, 而通过非聚集索引可以查到记录对应的主键值 , 再使用主键的值通过聚集索引查找到需要的数据
聚集索引(主键)是通往真实数据所在的唯一路径。
有一种例外可以不使用聚集索引就能查询出所需要的数据, 这种非主流的方法 称之为「覆盖索引」查询, 也就是平时所说的复合索引或者多字段索引查询.
例:
create index index_birthday_and_user_name on user_info(birthday, user_name);
这句SQL语句的执行过程就会变为
通过非聚集索引index_birthday_and_user_name查找birthday等于1991-11-1的叶节点的内容,然而, 叶节点中除了有user_name表主键ID的值以外, user_name字段的值也在里(即将user_name字段的值也存在叶子节点中)
索引的高效率主要体现在两点;
1)数据一般情况都是有顺序的,减少了查询扫描的行数;
2)索引数据结构一般采用各种二叉树的升级版来生成,这样的话查询比较更高效,二分比较法;
B树索引:以B树为数据结构而创建的索引,B树的特点是每个叶子节点到树根节点的距离都是相等的;B树结构如下图;
索引失效的场合总结:
索引创建了,但是不一定生效,有些查询语句会使得索引失效;常用的主要包括如下几种:
1)使用like%模糊查询的时候,包括‘%aaa’和‘%aaa%’,则不会走索引,但是‘aaa%’可以走索引(有时也不行);
2)查询语句中使用了is not null 或者 <>不等于比较运算符也会导致索引失效(有疑问);
3)对索引列使用了运算/函数的场合使得索引失效;如year(create_time)='2017';
4) 如果索引为复合索引,如果创建索引的第一列没有保护在where条件语句中,则查询不会走索引;
只要查询中包含了索引的列,或者复合索引中的第一列,并且不在上述四种情况,则查询会走索引,
另外:普通索引中存储的是排序后的与数据表中数据一一对应的指针数组,即索引的叶子节点中保存了当前记录在数据库表中的具体位置信息;通过索引
可以定位到数据信息。而丛生索引:随数据库创建而生成的主键索引,其叶子节点中存储的就是数据本身,而不是指针,所以对于查询来说,通过主键查询一定是最快的