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
?
答案 0 :(得分:1)
最好创建两个索引:relation(type, id_bar)
和relation(type, id_foo)
。
在您的情况下,两列可以按任意顺序排列。但是您需要两个索引来优化两个查询。
MySQL实际上有很多关于复合索引使用的文档。请参阅here。
答案 1 :(得分:1)
是的MySQL可以。您可以通过发出以下信息找到自己:
EXPLAIN SELECT id_foo FROM relation WHERE type = 'baz' AND id_bar = 128
有MySQL打印使用了哪些索引。
多列索引(类型,id_bar和类型,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
答案 2 :(得分:0)
为您计划拥有的每种类型的WHERE子句创建索引。 type
和id_bar
上的一个联合索引将有助于第一次查询。 type
和id_foo
上的另一个联合索引将有助于第二个。
一个将所有3个组合在一起的索引无济于事,因为它对任何单个查询都不够具体。