Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
索引Mysql时使用复合主键_Mysql_Sql - Fatal编程技术网

索引Mysql时使用复合主键

索引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

我正在使用MySQL 8.0

显示表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