Mysql。col1和col2上存在多列索引,将使用什么索引?

Mysql。col1和col2上存在多列索引,将使用什么索引?,mysql,indexing,query-performance,Mysql,Indexing,Query Performance,mysql 8.0.21 CREATE TABLE test ( id INT NOT NULL, last_name CHAR(30) NOT NULL, first_name CHAR(30) NOT NULL, PRIMARY KEY (id), INDEX name (last_name,first_name) ); sql是:从测试中选择*,其中姓氏介于'james'和'jones'之间,名字='M' 实际上,将使用什么索引,

mysql 8.0.21

CREATE TABLE test (
    id         INT NOT NULL,
    last_name  CHAR(30) NOT NULL,
    first_name CHAR(30) NOT NULL,
    PRIMARY KEY (id),
    INDEX name (last_name,first_name)
);
sql是:从测试中选择*,其中姓氏介于'james'和'jones'之间,名字='M'

实际上,将使用什么索引,姓、名还是仅仅是两列索引的一部分

ref:

你的姓、名索引恰好是一个。也就是说,数据库服务器可以满足索引中的整个查询,而无需返回表。这通常是一个性能胜利。因此,您的具体问题的答案是,是的,将使用两列索引。您的PK id值自动成为索引的一部分

这是一个完美的索引,可以最好地处理您的特定查询吗

  WHERE first_name = constant AND last_name BETWEEN whatever AND whatelse
不,不是。该查询的最佳索引是first\u name,last\u name。该索引允许服务器使用一个索引满足您的查询。它查找常量first_name和第一个匹配的last_name,然后通过索引扫描到最后一个匹配的last_name。这很快,即使是在一张大桌子上

@gmb是正确的。放置,数据库服务器将为您提供有关它如何满足您的查询的信息

学习Marcus Winand的这篇伟大的材料:

你关于姓、名的索引恰好是一个索引。也就是说,数据库服务器可以满足索引中的整个查询,而无需返回表。这通常是一个性能胜利。因此,您的具体问题的答案是,是的,将使用两列索引。您的PK id值自动成为索引的一部分

这是一个完美的索引,可以最好地处理您的特定查询吗

  WHERE first_name = constant AND last_name BETWEEN whatever AND whatelse
不,不是。该查询的最佳索引是first\u name,last\u name。该索引允许服务器使用一个索引满足您的查询。它查找常量first_name和第一个匹配的last_name,然后通过索引扫描到最后一个匹配的last_name。这很快,即使是在一张大桌子上

@gmb是正确的。放置,数据库服务器将为您提供有关它如何满足您的查询的信息


研究Marcus Winand的这篇伟大的材料:

这将是该选择的最佳索引:

可能您会同时想要:

INDEX(last_name, first_name)
INDEX(first_name, last_name)
也不要包括INDEXlast\u名称或INDEXfirst\u名称;它们混淆了优化器。看


构建最佳索引时,请从使用“=”测试的任何列开始。这是您示例中的第一个名称。更多信息:

这将是该选择的最佳索引:

可能您会同时想要:

INDEX(last_name, first_name)
INDEX(first_name, last_name)
也不要包括INDEXlast\u名称或INDEXfirst\u名称;它们混淆了优化器。看


构建最佳索引时,请从使用“=”测试的任何列开始。这是您示例中的第一个名称。更多信息:

使用,您可以自己查找。您的表定义中没有INDEXlast\u名称,因此您的问题应该重新措辞,询问它是否只使用两列索引的一部分。使用,您可以自己查找。您的表定义中没有INDEXlast\u名称,因此,您的问题应该重新措辞,询问它是否只使用两列索引的一部分。如果表中添加了另一列,索引将不再覆盖。但是,该索引将继续使用ICP index CONDICTION PUSHOWN Using index CONDICTION,这有一些好处。如果表中添加了另一列,索引将不再覆盖。然而,该指数将继续使用ICP指数条件下推使用指数条件,这有一些好处。