索引Mysql时使用复合主键
我正在使用MySQL 8.0索引Mysql时使用复合主键,mysql,sql,Mysql,Sql,我正在使用MySQL 8.0 显示表1中的索引 输出 我一直都明白,当我们使用复合主键时,要让查询使用ColumnName=B必须先使用ColumnName=A,因此您的查询如下所示: SELECT * FROM table1 WHERE A >= 10 AND B >= 10; 但是,当我在where子句中只使用B列时,它似乎仍然在使用索引。它返回数据的速度非常快。当我使用EXPLAIN语句时,它会输出 EXPLAIN SELECT * FROM table1
显示表1中的索引
输出
我一直都明白,当我们使用复合主键时,要让查询使用ColumnName=B
必须先使用ColumnName=A
,因此您的查询如下所示:
SELECT *
FROM table1
WHERE A >= 10
AND B >= 10;
但是,当我在where子句中只使用B列时,它似乎仍然在使用索引。它返回数据的速度非常快。当我使用EXPLAIN语句时,它会输出
EXPLAIN
SELECT *
FROM table1
WHERE B >= 10;
在这里它似乎使用外键,如果没有,我们需要使用主键和seq_In_index=1,然后seq_In_index=2来使用第二个主索引呢?MySQL最近引入了跳过扫描索引优化。这基本上会对第一个键的每个值进行范围扫描,如中所述: 但是,从MySQL 8.0.13开始,优化器可以使用一种称为跳过扫描的方法执行多个范围扫描,每个f1值一个范围扫描
因此,索引可以用于您正在使用的查询。MySQL最近引入了跳过扫描索引优化。这基本上会对第一个键的每个值进行范围扫描,如中所述: 但是,从MySQL 8.0.13开始,优化器可以使用一种称为跳过扫描的方法执行多个范围扫描,每个f1值一个范围扫描
因此,索引可以用于您正在使用的查询。有趣的操作。要评估它的性能并不容易…@theimpler。只有Oracle数据库(据我所知,可能还有其他数据库)进行了跳过扫描优化。我不认为这是一个巧合,同一家公司拥有这两个。有趣的操作。要评估它的性能并不容易…@theimpler。只有Oracle数据库(据我所知,可能还有其他数据库)进行了跳过扫描优化。我不认为同一家公司同时拥有这两家公司是巧合。
EXPLAIN
SELECT *
FROM table1
WHERE B >= 10;
id select_type table type poss_key key key_len ref rows Extra
1 simple table1 range A_foreign A_foreign 4 104 Using Where