5

我有下表 ( 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

4

2 回答 2

2

ORDER BY优化中所述:

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

[ deletia ]

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

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

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

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

[ deletia ]

选择 * 从 t1
  WHERE key_part1 =常量
  ORDER BY key_part2

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

于 2012-09-02T19:11:41.983 回答
1

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

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

希望这是有道理的:-)

于 2012-09-02T19:08:05.417 回答