Mysql。col1和col2上存在多列索引,将使用什么索引?
mysql 8.0.21Mysql。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' 实际上,将使用什么索引,
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指数条件下推使用指数条件,这有一些好处。