前面有的文章简要说明的mysql的索引,其中也涉及到了innodb的索引。再总结深入一下:
1,innodb的聚集索引是按照主键的顺序进行排序,而聚集索引的存储是按照指针的逻辑位置进行排序,也就是说指针的逻辑指针也是按照顺序进行递增的。
这说明:
1.1 如果在sql查询中按照主键进行排序操作那么是非常快的,无论是升序排列还是降序排序(B+树的叶子节点是用一个双向链表联系在一起的)
select * from table order by id limit 50; //id为主键,通过分析sql执行计划是没有进行filesort操作的;同理对主键的范围查询也是如此
select * from table where id > 2 and id < 90;
2,辅助索引,关于辅助索引的一个关键点为,辅助索引的叶子节点中包含了一个主键值。如果通过辅助索引进行数据检索的过程如下;
步骤一:在辅助索引上查找数据;
步骤二:在辅助索引上完成数据索引后,得到主键值,再通过主键值进行在聚集索引上进行第二遍的索引查找过程。
3,上述可知,两次索引查找也有些繁琐和浪费的。为了在有些情况下避免这种浪费,innodb引入了覆盖所用的的技术。
前面的文章简单说了一下覆盖索引的概念和例子,不过当时没有完全理解。下面用简单的话再次理解一遍。
几个关键点:
3.1 覆盖索引是建立在联合索引的基础之上的。也就是说如果用到覆盖索引那么必须要有联合索引。如:
一张表的结构为:
create table table1 {
a int;
b int;
c varchar;
d int;
primary key (d);
key uninkey(a,b)
}
如表中存在7条数据:
d列 | a列 | b列 | c列 |
1 | 4 | 2 | Qw |
2 | 4 | 3 | Ewe |
3 | 4 | 5 | Wer |
4 | 8 | 4 | 阿萨德、 |
5 | 8 | 1 | Dfas |
6 | 8 | 6 | 阿 |
7 | 5 | 1 | D |
索引结构为(辅助索引,a b列上建立的联合索引结构)
观察索引结构可知:
按联合索引的最左进行排序,每个节点内左边的第一个索引也进行了排序;这其实就是最左前缀原则。如扩展到三个字段建立的联合索引,依此类推。
覆盖索引,即省去了用覆盖索引查询到结果后再进行的一次聚集索引的检索。
Select b from table1 where a = 4;//select后面加上b很重要。
违反最左前缀的一种情况
Select count(*) from table1 where b >2 and b < 6;
在这种情况下其实是使用到覆盖索引的,不过通过联合索引的结构进行分析,其实也只是部分用到了索引(覆盖索引)。不过不太理解。