MySQL - 基于更多索引的查找

时间:2014-08-15 13:16:02

标签: mysql sql indexing

MySQL可以使用两个或更多索引搜索表行吗?

我有一个包含这些列的表:

relation:
- type varchar(32)
- id_foo int
- id_bar int

我需要根据type以及presta_idvario_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

为此表和这些搜索查询定义索引的正确方法是什么?

我应该在所有三列(typeid_fooid_bar)上放置单独的索引,还是最好创建两个多列索引 - type + id_footype + id_bar

3 个答案:

答案 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.htmlhttp://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html

答案 2 :(得分:0)

为您计划拥有的每种类型的WHERE子句创建索引。 typeid_bar上的一个联合索引将有助于第一次查询。 typeid_foo上的另一个联合索引将有助于第二个。

一个将所有3个组合在一起的索引无济于事,因为它对任何单个查询都不够具体。