【问题标题】:How to correctly index the following?如何正确索引以下内容?
【发布时间】:2012-08-27 15:46:25
【问题描述】:

我有下表 (file_category_tbl) 来表示文件和类别之间的连接。

fileId - bigint(20)         
categoryId - bigint(20)
order - int(10)

为了可以对某个类别中的文件进行排序,我有一个 order 字段... 因此,我的问题是我需要哪些索引才能在以下方面获得最佳性能:

SELECT * FROM file_category_tbl WHERE categoryId="3" ORDER BY order ASC

我有一个唯一索引 UNIQUE (fileId ,categoryId); 因为不可能有相同的fileId 和相同的categoryId。 我在categoryId 上也有一个索引,因为这是正在搜索的内容。 我也有一个关于order的索引?...但这有必要吗?因为它只是在这个上面做一个orderBy...

向任何响应者致以诚挚的问候... J

【问题讨论】:

标签: php mysql indexing


【解决方案1】:

ORDER BY Optimization 中所述:

在某些情况下,MySQL 不能使用索引来解析 ORDER BY,尽管它仍然使用索引来查找与 WHERE 匹配的行 子句。这些案例包括:

[ deletia ]

  • 用于获取行的键与ORDER BY中使用的键不同:

    SELECT * FROM t1 WHERE key2=常量 ORDER BY key1 em>;

因此,您当前的索引不能用于执行排序操作。但是,同一页面也记录了:

即使 ORDER BY 与索引不完全匹配,也可以使用索引,只要索引的所有未使用部分和所有额外的 ORDER BY 列是 WHERE 子句中的常量。以下查询使用索引来解析 ORDER BY 部分:

[ deletia ]

选择 * FROM t1
  WHERE key_part1=常量key_part2 订购;

因此,(categoryId,order) 上的复合索引可用于两种过滤器排序操作,这是此查询的最佳结果。

【讨论】:

    【解决方案2】:

    据我了解,您的索引是明智的,有助于提高查询的性能。但我也建议您在表中使用Primary Key 索引,而不是仅使用组合的Unique Index

    我这么说的原因是,如果您想引用此表的任何记录,可能是删除它或执行任何其他功能,主键会很有用。另一方面,它实际上可能会降低查询的性能,因为您需要所有字段,而现在使用主键字段,您必须引入 4 个字段。作为解决方案,您可以指定结果中所需的列。

    希望这是有道理的:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-19
      相关资源
      最近更新 更多