如何正确索引以下内容?

时间:2012-09-02 18:53:51

标签: php mysql indexing

我有下表(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(fileIdcategoryId); 由于fileId具有相同的categoryId,因此不能相同。 我在categoryId上也有一个索引,因为这是搜索的内容。 我还有order的索引?...但是这是必要的吗?因为它只对此进行orderBy ...

亲切的问候任何响应者...... J

2 个答案:

答案 0 :(得分:2)

正如ORDER BY Optimization所述:

  

在某些情况下,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个字段。作为解决方案,您可以在结果中指定所需的列。

希望这是有道理的: - )