数据库中查找操作非常普遍,索引就是提升查找速度的一种手段。
B+树索引 它就是传统意义上的索引,它是最常用、最有效的索引。
哈希索引 哈希索引是一种自适应的索引,数据库会根据表的使用情况自动生成哈希索引,我们人为是没办法干预的。
全文索引 用于实现关键词搜索。但它只能根据空格分词,因此不支持中文。 若要实现搜索功能,可选择lucene。
RTree索引 在mysql很少使用,仅支持geometry数据类型;相对于BTREE,RTREE的优势在于范围查找。
数据库以页为存储单元,一个页是8K(8192Byte),一页可以存放N条记录。 页在B+树中分为:数据页和索引页。 B+树的高一般为2-4层,因此查找某一键值的行记录只需2-4次IO,效率较高。
不管是聚集索引还是非聚集索引,它们的逻辑结构都一棵是B+树,它们的唯一区别在于:
聚集索引的数据页存放的是完整的记录;也就是说,聚集索引决定了表的物理存储顺序;非聚集索引的数据页只存指向记录的地址信息,它真正的数据已经在聚集索引中存储了。联合索引 当查询条件涉及多列时,可以使用联合索引。
覆盖索引 只需通过辅助索引就能获取要查询的信息,而无需再次通过聚集索引查询具体的记录信息。 由于覆盖索引并不包含整行的记录,因此它的大小远远小于聚集索引。 它比较适合做一些统计操作。
主键索引 在主键索引中,索引页中存放的是主键和指向数据页的偏移量;数据页中存放的是主键和该主键所属行记录的地址空间。
辅助索引 在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。
综上所述,在MyISAM中,索引文件和数据文件分开存放,不管是主键索引还是辅助索引,都属于非聚集索引。
主键索引 索引页仍然存放主键和和指向数据页的偏移量,但数据页存放的是完整的记录。 也就是在InnoDB中,数据和主键索引是存放在一起的。
辅助索引 索引节点存放的内容一样,仍然是键值信息和指向数据页的偏移量;但数据页中存放的是键值信息和该键值对应的主键。然后通过主键查询主键索引就能找到该条记录。
综上所述:
聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。InnoDB的辅助索引也会包含主键列,所以,如果主键定义的比较大,其他索引也将很大。如果想在表上定义 、很多索引,则争取尽量把主键定义得小一些。InnoDB 不会压缩索引。