表格
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 :(得分:2)
第一个。 MySQL可以使用任一索引来获取结果集,而无需从实际表中读取。第一个索引的效率略高,因为没有必要执行重新排序行的额外步骤。
答案 1 :(得分:0)
对于您的查询,您只需要f2上的索引。
如果您使用诸如“f1 = 12和f2 = 15”之类的whereclause进行查询,则 可能 也需要f1和f2的索引。但是,主键可能会更快地为您提供结果,具体取决于数据和完整查询。
如果您对3(在where子句中)的查询范围内,您(可能)需要一个覆盖3个字段的索引。
15年来,我从未面临过仅为订购结果创建索引的需求。这个操作非常快。什么是缓慢的是找到行(where子句),而不同的集匹配(连接)。
现在,如果您不确定,请创建两者。你查询并检查一个mysql使用的explain_plan。然后放弃另一个^^。