2010-06-30 83 views
1

说,如果我有一个查询,如下所示:MySQL的 - 多列索引的顺序

SELECT * FROM table WHERE category='5' and status='1' LIMIT 5 

表有一个百万行。

为了加快速度,我创建了索引(状态,类别),即多列索引。

有600个类别,但只有2个状态(1或0)。我想知道如果我创建索引(类别,状态)而不是索引(状态,类别)是否有任何性能差异。

+0

您可以根据需要创建任意数量的索引。同时创建索引。 – Salil 2010-06-30 06:36:41

+2

索引不是免费的。告诉人们创造它们并不是明智的建议。需要有一个使用它们的理由,而且它们需要时间维护(特别是在插入时)。需要仔细选择索引。这是假设聚集索引。 对于这个例子,要么工作。 但是,如果您将索引用于其他工作,则需要小心。如果您在(状态,类别)上创建索引并仅为其他查询选择类别,则索引查找速度会低于(类别,状态)。 – Chimmy 2010-06-30 06:43:47

回答

2

应该没有什么区别。无论您订购它(类别,状态)还是(状态,类别),索引的选择性都是相同的。

顺便说一句,使用LIMIT通常没有使用ORDER BY也没有意义。除非您指定订单,否则由SQL查询返回的行的顺序是任意的。


回复您的评论:是的,这是常见的需5个随机行,但任意是不一样随意。需要五个任意行是不常见的。

+1

没意思?但是如果我只需要5行,不管订单是什么。有这个查询有意义吗? (当然,如果我添加ORDER BY会更好,但是恐怕会进一步减慢查询的速度。) – 2010-06-30 06:39:31

3

状态优先。 诀窍是,如果你只需要按类别查询,你可以。

SELECT * from table where status in (1,0) and category = 'whatever' 

仍然得到索引支持。 当然,如果你的查询都使用两列,那么它们的方法都是一样的,,但在这种情况下,如果你只使用状态,它会好得多,而且只有类别只有稍微差一些。

如果您也在查看大量插入内容,您希望最小化索引数量,所以这是您最好的选择,而不是具有多个索引。

+0

+1在最小化索引时,如果插入是常见的。尽管费用很高,但很多人都会过分轻率地创建索引。 – Chimmy 2010-06-30 06:58:05