|
txwdhs 发表于 2011-11-15 16:40 ![]()
看了你之前发的关于索引的帖子,有些疑问:
secondary index具体是什么呢?怎么才算是secondary index? ...
在InnoDB存储引擎中,除了主键索引外,其余的索引就是secondary index。
主键索引有一个特别的地方,就是数据在物理磁盘上的存储顺序和主键索引的顺序一样。也就是说数据在物理磁盘上也是有序的。这里就可以得出几个结论:
1.一个表任何一个时候在磁盘上只可能有一种组织顺序,也就是主键索引只有一个。
2.如果利用主键索引的查找,效率会比较高。
主键索引分三种形式。
1>当存在主键的时候,那么这个主键索引就建在主键上
2>当主键不存在,但是存在一个列是not null约束,且这个列上有一个唯一索引(unique index),那么这个列上的索引就是主键索引
3>当前两者都不满足时,存储引擎会自动创建一个六字节的伪列,然后主键索引创建在这个伪列上。
所以,在InnoDB存储引擎中的表数据无论怎样都是有序的。
至于secondary index,就是除了刚才的哪几种情况,其余的索引都是属于secondary index。
因为如果这些索引是用b-tree实现的。而作为树形结构,在每个分支的最后一个节点(准确的说就是出度为0)就是叶子节点。在主键索引中,叶子节点存储的就是一行的所有字段。而在secondary index的叶子节点存储的只有被索引的字段+主键索引字段信息。
那么在利用这两种索引时有两种情况:
1.query需要的字段全部在被索引的字段里面(主键索引就是这样情况,因为叶子节点包括了全部字段),那么就仅仅只需要扫描这个索引就能得到需要的信息,这里也说明了利用主键索引的效率比较高。
2.如果query需要的字段信息不全在它利用的这个索引字段里面,那么它就必须去其他的文件获取,而对于secondary index, 如果query需要的字段不全在这个secondary index字段里面,那么就还必须去扫描主键索引。当然如果全部在的话,那就不必要了
比如:
有一个secondary index idx_a_b_c在 (a ,b, c)字段上。而我一个query利用了这个索引idx_a_b_c,且需要a,b,c,d这几个字段信息。现在a,b,c在idx_a_b_c中有了,还有d需要怎么办呢? 那就只好去扫描主键索引了,而假如query利用了idx_a_b_c这个索引,且只需要a,b,c这三个字段,那么仅仅利用这个索引就能够完成了,不需要额外的I/O去扫描主键索引。
说的有些混乱,希望理解~~~ |
|