1. CREATE TABLE single_table (
  2. id INT NOT NULL AUTO_INCREMENT,
  3. key1 VARCHAR(100),
  4. key2 INT,
  5. key3 VARCHAR(100),
  6. key_part1 VARCHAR(100),
  7. key_part2 VARCHAR(100),
  8. key_part3 VARCHAR(100),
  9. common_field VARCHAR(100),
  10. PRIMARY KEY (id),
  11. KEY idx_key1 (key1),
  12. UNIQUE KEY idx_key2 (key2),
  13. KEY idx_key3 (key3),
  14. KEY idx_key_part(key_part1, key_part2, key_part3)
  15. ) Engine=InnoDB CHARSET=utf8;

一,访问方法

MySQL执行查询语句的方式称之为访问方法或者访问类型。

1. const

通过主键或唯一二级索引与常数的等值比较来定位一条记录的方法。

Tips:

  • 唯一二级索引为Null的情况不能应用。

2. ref

通过二级索引与常数的等值比较来定位记录的方法。

Tips:

  • 二位索引值为NULL的时候,使用ref的访问方法
  • 对于包含多个列的联合索引来说,只要最左边的连续索引列是与常数的等值比较就可能使用ref的访问方法

3. ref of null

当我们不仅想找出二级索引与常数相等,且想把该列的值为NULL也给找出来的时候,应用了索引查找,这种访问方法称为ref of null
**

4. rang

利用索引进行范围匹配

5. index

直接遍历二级索引的方式

6. all

全表扫描

二,索引合并

MySQL在一般情况下执行一个查询时最多只会用到单个二级索引,但不是还有特殊情况么,在这些特殊情况下也可能在一个查询中使用到多个二级索引。

1. Intersection合并

查询使用多个二级索引,搜索条件使用AND,将多个二级索引中查询到的结果取交集。

应用场景:

  • 二级索引列是等值匹配的情况,对于联合索引来说,在联合索引中的每个列都必须等值匹配。
  • 主键列可以是范围匹配。

优化器只有在单独根据搜索条件从某个二级索引中获取的记录数太多,导致回表开销大,而通过Intersection索引合并后需要回表的记录数大大减少时才会使用Intersection索引合并

2. Union合并

查询使用多个二级索引,搜索条件使用OR,将多个二级索引中查询到的结果取并集。

应用场景:

  • 二级索引列是等值匹配的情况,对于联合索引来说,在联合索引中的每个列都必须等值匹配。
  • 主键列可以是范围匹配。
  • 使用Intersection索引合并的搜索条件。

    3. Sort-Union合并

    先按照二级索引记录的主键值进行排序,之后按照Union索引合并方式执行的方式称之为Sort-Union索引合并。