【问题标题】:Mysql - sequence of multiple column indexesMysql - 多列索引的序列
【发布时间】:2010-06-30 06:33:41
【问题描述】:

如果我有如下查询:

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

该表有 100 万行。

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

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

【问题讨论】:

  • 您可以创建任意数量的索引。创建两个索引。
  • 索引不是免费的。告诉人们创建它们不是明智的建议。需要有使用它们的理由,而且它们确实需要时间来维护(尤其是在插入时)。需要仔细选择索引。这是假设聚集索引。在这种情况下,任何一个都可以。但是,如果您将索引用于其他工作,则需要小心。如果您在 (status, category) 上创建索引并仅为另一个查询选择类别,则索引查找速度会比 (category, status) 慢。

标签: mysql indexing


【解决方案1】:

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

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

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

如果您还要查看大量插入,则希望尽量减少索引的数量,因此这是您最好的选择,而不是拥有多个索引。

【讨论】:

  • +1 如果插入很常见,则最小化索引。许多人不顾成本地太轻视创建索引。
【解决方案2】:

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

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


关于您的评论:是的,通常需要五个 随机 行,但任意与随机不同。需要五个任意行并不常见。

【讨论】:

  • 毫无意义?但是如果我只想要 5 行,不管顺序是什么。有这个查询有意义吗? (当然,如果加上 ORDER BY 会更好,但恐怕会进一步减慢查询速度。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 2011-03-04
  • 1970-01-01
  • 2019-02-09
相关资源
最近更新 更多