根据索引对数据表中记录顺序的影响,索引分为聚集索引和非聚集索引。
聚集索引
聚集索引的特点是数据文件中的记录按照索引键指引的顺序排列,使得具有相同索引键值的记录在物理上聚集在一起。由于一个数据表只能有一种实际的存储顺序,因此在一个数据表中只能建立一个聚集索引。
理解:如果基于某个字段建立了一个聚集索引(如主键),那么表中的记录会自动按照该字段的顺序进行存储。
因此可以利用数据表本身的顺序来查找记录。
【重要】将数据存储与索引放到了一块,找到索引也就找到了数据(叶子结点是数据块)
非聚集索引
非聚集索引不会影响数据表中记录的实际存储顺序,一个表只能有一个聚集索引,但可以有多个非聚集索引。
理解:在已经建立索引的前提条件下,对另外字段建立一个非聚集索引,该字段索引中是升序排列的,但整个表的记录的实际存储顺序不会因该索引的创建而发生变化。
【重要】非聚集索引叶节点仍然是索引节点,只是有一个指针指向对应的数据块(一般是主键/聚集索引),因此当查询的字段不在叶子结点中时,需要进行二次查询
区别和优缺点
- InnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上,若使用”where id = 14”这样的条件查找主键,则按照B+树的检索算法即可查找到对应的叶节点,之后获得行数据。
- 若对Name列进行条件搜索,则需要两个步骤:第一步在辅助索引B+树中检索Name,到达其叶子节点获取对应的主键。第二步使用主键在主索引B+树种再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据。(重点在于通过其他键需要建立辅助索引)
- MyISM使用的是非聚簇索引,非聚簇索引的两棵B+树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。表数据存储在独立的地方,这两颗B+树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通过辅助键检索无需访问主键的索引树。
什么情况下设置了索引但是无法使用
- 以“%”开头的LIKE语句,模糊匹配
- OR语句前后没有同时使用索引(OR前后字段都要创建索引才行)
- 数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型)
总结
- 聚集索引就是索引和记录紧密的在一起,叶子节点就是数据块
- 非聚集索引 索引文件和数据文件分开存放,索引文件的叶子页只保存了主键值,要定位还要再根据主键值查找
- 聚集索引只有一个,非聚集索引可以有多个