MySQL Innodb 索引优化笔记
时间:2006-12-11 来源:gladness
同事推荐给我一篇关于MySQL Innodb索引的文章,非常有价值,原文链接:
http://xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/
记录要点如下:
InnoDB为每个表建立一个clustered索引。如果该表有主键的话,那么clusterd索引就是主键。否则会为每一行数据分配一个6字节的唯一标识,用作clustered索引。
Innodb的索引都是BTREE索引。而主键的页节点就是每一行的所有数据。
而副索引(secondary index),即非主键索引,它的页节点是主键的值。这样副索引就独立于主键的物理顺序了,同时副索引并不直接指向某一行数据。基于副索引的搜索会比基于主键的搜索开销大一些,因为通过副索引得到的只是主键的值,还需要通过主键去得到该行记录的数据。
副索引的这种结构提供了不同于其他数据库引擎的优化方式。每一个副索引都包含了主键的值。如果一个查询的结果集只包含主键列和副索引列,那么这个查询可以直接从副索引中得中,而不需要访问表中的数据。
其二,如果副索引是联合索引,包含主键列,并且主键列排在索引的最后面时,这样的副索引是完全没有必要的。
从这个角度,也得出尽量不要使用select *。因为如果仅使用需要的列,是有可能用到上面所说的优化方式的。
也说明了在INNODB中,主键如果比较长,会比较占空间的一个原因。因为每个副索引中都有主键的值。
http://xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/
记录要点如下:
InnoDB为每个表建立一个clustered索引。如果该表有主键的话,那么clusterd索引就是主键。否则会为每一行数据分配一个6字节的唯一标识,用作clustered索引。
Innodb的索引都是BTREE索引。而主键的页节点就是每一行的所有数据。
而副索引(secondary index),即非主键索引,它的页节点是主键的值。这样副索引就独立于主键的物理顺序了,同时副索引并不直接指向某一行数据。基于副索引的搜索会比基于主键的搜索开销大一些,因为通过副索引得到的只是主键的值,还需要通过主键去得到该行记录的数据。
副索引的这种结构提供了不同于其他数据库引擎的优化方式。每一个副索引都包含了主键的值。如果一个查询的结果集只包含主键列和副索引列,那么这个查询可以直接从副索引中得中,而不需要访问表中的数据。
其二,如果副索引是联合索引,包含主键列,并且主键列排在索引的最后面时,这样的副索引是完全没有必要的。
从这个角度,也得出尽量不要使用select *。因为如果仅使用需要的列,是有可能用到上面所说的优化方式的。
也说明了在INNODB中,主键如果比较长,会比较占空间的一个原因。因为每个副索引中都有主键的值。
相关阅读 更多 +