再说innodb索引
2014-11-30 08:52
155 查看
前面有的文章简要说明的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条数据:
索引结构为(辅助索引,a b列上建立的联合索引结构)
观察索引结构可知:
按联合索引的最左进行排序,每个节点内左边的第一个索引也进行了排序;这其实就是最左前缀原则。如扩展到三个字段建立的联合索引,依此类推。
覆盖索引,即省去了用覆盖索引查询到结果后再进行的一次聚集索引的检索。
Select b from table1 where a = 4;//select后面加上b很重要。
违反最左前缀的一种情况
Select count(*) from table1 where b >2 and b < 6;
在这种情况下其实是使用到覆盖索引的,不过通过联合索引的结构进行分析,其实也只是部分用到了索引(覆盖索引)。不过不太理解。
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 |
观察索引结构可知:
按联合索引的最左进行排序,每个节点内左边的第一个索引也进行了排序;这其实就是最左前缀原则。如扩展到三个字段建立的联合索引,依此类推。
覆盖索引,即省去了用覆盖索引查询到结果后再进行的一次聚集索引的检索。
Select b from table1 where a = 4;//select后面加上b很重要。
违反最左前缀的一种情况
Select count(*) from table1 where b >2 and b < 6;
在这种情况下其实是使用到覆盖索引的,不过通过联合索引的结构进行分析,其实也只是部分用到了索引(覆盖索引)。不过不太理解。
相关文章推荐
- MyISAM和Innodb索引的区别(转)
- 理解B+树算法和Innodb索引
- Innodb存储引擎索引概述
- InnoDB常见索引
- 8.3.7 InnoDB and MyISAM Index Statistics Collection InnoDB 和MyISAM 索引统计信息搜集
- InnoDB的关键特性-插入缓存,两次写,自适应hash索引详解
- 关于InnoDB表如何设计索引的小结
- 一次innodb自增主键与索引列null或者not null重要性案例
- mysql引擎InnoDB索引中的cardinality关键字
- Innodb的索引
- MySQL innoDB索引底层原理详解
- InnoDB一定会在索引中加上主键吗
- MySQL InnoDB引擎索引长度受限怎么办?
- 警惕 InnoDB 和 MyISAM 创建 Hash 索引陷阱
- InnoDB事务锁之行锁--聚集索引加锁流程
- InnoDB与MyISAM索引实现
- MyISAM和InnoDB的索引在实现上的不同
- mysql innodb 索引深入解析
- 学习笔记:InnoDB表空间和索引结构
- 【转】myisam和innodb索引实现的不同