繁体   English   中英

同一列上的索引和分区

[英]Indexing and Partition on same column

我们可以在日期列上进行分区,例如:

按范围分区(TO_DAYS(date_time))(

和基于一天中的小时在同一列上建立索引,例如:

CREATE INDEX index_name ON tabel_name (HOUR(date_time));

分区是必需的,以便通过简单地删除分区可以轻松删除以后的数据。 索引我们正试图加快基于 date_time 列的查询(因为一天也会有数百万行)。

这是正确的方法吗?它将如何表现? 还有其他更好的方法吗?

可能是。

分区非常适合清除旧数据,但对大多数查询没有好处。 小时索引不太可能被使用。 让我们看看查询。

典型的SELECT是什么? 如果它在其他列上进行过滤,则按小时编制索引是无用的。 如果您仅按小时或任何日期时间类型值进行过滤,那么将日期时间作为非分区表中的第一列是最佳选择。 (并且PARTITIONing仅对清除“旧”数据有益。)

请注意,值为 0..23 的索引仅对指定 0 到 23 之间的值的查找有用。如果要查找特定日期中午某个时间的行:

WHERE dt >= '2020-01-02 12:00:00'
  AND dt  < '2020-01-02 12:00:00' + INTERVAL 1 HOUR

是最实用和有效的方法。 这需要一个带有dt的索引,而不是一个独立的小时索引。

有关清除的更多信息: http://mysql.rjweb.org/doc.php/partitionmaint

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM