【发布时间】:2016-10-17 06:40:37
【问题描述】:
我有一个简单的历史表,我正在开发一个新的查找表。我想知道添加到该表中的最佳索引(如果有的话)是什么,以便尽可能快地查找。
历史表是一组简单的操作记录。每个动作都有一个类型和一个动作日期(以及一些其他属性)。系统每天都会生成一组新的操作记录。
相关的伪模式是:
TABLE history
id int,
type int,
action_date date
...
INDEX
id
...
注意:该表没有在type 或action_date 上编入索引。
新的查找功能旨在检索在特定操作日期发生的特定类型的所有记录。
我最初的想法是定义一个由type 和action_date 组成的复合键。
但是,在我的情况下,会有许多具有相同类型和日期的操作。此外,每天的行动数量将大致均匀分布。
鉴于以上所有情况:(a) 是一个值得的索引; (b) 如果是,首选索引是什么?
我正在使用 MySQL,但我认为我的问题并非特定于此 RDBMS。
【问题讨论】:
-
在 (type,action_date) (和/或 (action_date,type)) 上的索引似乎是明智的
-
我会在日期 + 类型上使用复合索引。聚类因子会非常好,因为数据似乎是按日期排序的,所以我希望它能够很好地工作。但是,您必须对其进行测试,如果具有相同日期和类型的数据量非常多,则索引可能必须查找很多节点。
-
如果复合索引运行良好,您也可以选择仅索引扫描,方法是将您要选择的其他字段添加到索引中。这样数据库就不需要从实际表中获取它们。 (但我猜这是另一个话题)
-
您可以按类型或日期使用某些表分区。这将为查询带来一些速度。 arubin.org/files/PracticalPartitioning_Webinar.pdf
-
@valicu2000 - 在这种情况下,合适的索引似乎是可行的。因此,分区不太可能提高性能。
标签: mysql sql performance indexing