2011-11-12 32 views
2

表:我应该选择哪个指数(MySQL的)

CREATE TABLE `table1` (
    `f1` int(11) NOT NULL default '0', 
    `f2` int(4) NOT NULL default '0', 
    `f3` bigint(20) NOT NULL default '0', 
    PRIMARY KEY (`f1`) 
) TYPE=MyISAM 

查询:

select `f1` from table1 where `f2`=123 order by `f3` desc; 

我想创建一个 “覆盖索引” 此查询

ALTER TABLE `table1` ADD INDEX (`f2`,`f3`,`f1`); 

ALTER TABLE `table1` ADD INDEX (`f2`,`f1`,`f3`); 

我应该选哪个?

+0

我怀疑他们中的任何一个都会以显着的方式帮助你。 – NullUserException

+0

@NullUserExceptionఠ_ఠ我确定有用,但我不知道哪个更好 – Koerr

回答

2

第一个。 MySQL可以使用任一索引来获取结果集,而无需从实际表中读取。第一个索引稍微高效一些,因为不需要执行重新排序行的额外步骤。

+1

是的,第一个索引只需要顺序读取与WHERE子句匹配的那部分索引,而不需要任何额外的排序。它为改善查询性能提供了最大的机会。 –

0

为你查询你只需要在f2上的索引。

,如果你有像whereclause查询 “其中f1 = 12和f2 = 15”,你可能想在f1和f2的指数了。但是,根据数据和完整查询,主键可能会更快地为您提供结果。

如果您有3个查询(在where子句中),您(可能)需要一个覆盖3个字段的索引。

15年来,我从来没有面临需要创建一个仅用于排序结果的索引。这个操作非常快。什么是慢找到行(where子句),和不同的集匹配(连接)。

现在如果您不确定,请同时创建。你是否使用explain_plan查询和检查哪一个mysql使用?然后放下其他^^。

+0

添加'f3'来索引以避免文件索引,'f1'索引以覆盖索引。 **覆盖索引:**包含(或“覆盖”)满足查询所需的所有数据的索引称为覆盖索引。覆盖索引可以是一个非常强大的工具,可以显着提高性能。 – Koerr

+0

是啊是啊是的,但非* self *涵盖索引和索引大小使他们...双刃剑。正如你所说,***在*** *条件下可以非常强大。 ... 2月29日哪个。 – roselan

相关问题