我有下表(file_category_tbl
)来表示文件和类别之间的连接。
fileId - bigint(20)
categoryId - bigint(20)
order - int(10)
为了可以订购类别中的文件,我有一个订单字段...... 因此,我的问题是我需要哪些索引才能获得最佳性能:
SELECT * FROM file_category_tbl WHERE categoryId="3" ORDER BY order ASC
我有一个唯一的索引a UNIQUE(fileId
,categoryId
);
由于fileId
具有相同的categoryId
,因此不能相同。
我在categoryId
上也有一个索引,因为这是搜索的内容。
我还有order
的索引?...但是这是必要的吗?因为它只对此进行orderBy
...
亲切的问候任何响应者...... J
答案 0 :(得分:2)
在某些情况下,MySQL 无法使用索引来解析
ORDER BY
,尽管它仍然使用索引来查找与 {匹配的行{1}} 子句。这些案例包括以下内容:
WHERE
用于获取行的密钥与
[ deletia ]
中使用的密钥不同:SELECT * FROM t1 WHERE key2=constant ORDER BY key1;
因此,您当前的索引不能用于执行排序操作。但是,同一页面也记载了文件:
即使
ORDER BY
与索引不完全匹配,也可以使用索引,只要索引的所有未使用部分和所有额外的 { {1}} 列是ORDER BY
子句中的常量。以下查询使用索引来解析ORDER BY
部分:
WHERE
SELECT * FROM t1 WHERE key_part1=constant ORDER BY key_part2;
因此,ORDER BY
以上的复合索引可用于过滤器和排序操作,这是此查询的最佳结果。
答案 1 :(得分:1)
根据我的理解,您的索引是合理的,有助于您的查询的性能。但我还建议您在表格中添加Primary Key
索引,而不是仅将Unique Index
我告诉它的原因是,如果你想引用这个表的任何记录,可能是删除它或做任何其他功能,主键是有用的。另一方面,它可能实际上降低了查询的性能,因为您需要所有字段,现在需要使用主键字段,您必须引入4个字段。作为解决方案,您可以在结果中指定所需的列。
希望这是有道理的: - )