CREATE TABLE single_table (
id INT NOT NULL AUTO_INCREMENT,
key1 VARCHAR(100),
key2 INT,
key3 VARCHAR(100),
key_part1 VARCHAR(100),
key_part2 VARCHAR(100),
key_part3 VARCHAR(100),
common_field VARCHAR(100),
PRIMARY KEY (id),
KEY idx_key1 (key1),
UNIQUE KEY idx_key2 (key2),
KEY idx_key3 (key3),
KEY idx_key_part(key_part1, key_part2, key_part3)
) 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,将多个二级索引中查询到的结果取并集。
应用场景: