MySQL可以使用两个或多个索引搜索表行吗?
我有一张有这些列的桌子:
relation:
- type varchar(32)
- id_foo int
- id_bar int我需要基于type和presta_id或vario_id搜索行。查询将如下所示:
SELECT id_foo FROM relation WHERE type = 'baz' AND id_bar = 128
SELECT id_bar FROM relation WHERE type = 'qux' AND id_foo = 256为这个表和这些搜索查询定义索引的正确方法是什么?
是在所有三列(type、id_foo、id_bar)上放置单独的索引,还是创建两个多列索引type + id_foo和type + id_bar更好?
发布于 2014-08-15 13:18:52
最好创建两个索引:relation(type, id_bar)和relation(type, id_foo)。
在您的示例中,这两列都可以按任意顺序排列。但是您需要两个索引来优化这两个查询。
实际上,MySQL在使用复合索引方面有相当好的文档。见这里。
发布于 2014-08-15 13:19:02
是的MySQL可以。你可以通过发布:
EXPLAIN SELECT id_foo FROM relation WHERE type = 'baz' AND id_bar = 128MySQL打印使用了哪些索引。
多列索引(type,id_bar和type,id_foo;为了加快两个select查询速度都需要这两者)是加速这类查询的一种可能的方法,但是,多列索引并不是在所有情况下都有意义的。例如,如果您有不包括类型的查询,那么类型和id_bar上的多列索引(按这个顺序排列)不会有帮助。
见http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html和http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html
发布于 2014-08-15 13:18:48
为您计划拥有的WHERE子句的每种类型创建索引。type和id_bar上的一个联合索引将有助于第一个查询。type和id_foo的另一个联合指数将对第二个指数有所帮助。
一个索引将所有3组合在一起将不会有帮助,因为它对任何单个查询都不够具体。
https://stackoverflow.com/questions/25327070
复制相似问题