索引如何与 MySql 分区表配合使用

Man*_*-kr 2 mysql indexing partition

我有一个包含时间信息的表,所以该表包含年、月、日、小时等列。
表有跨年的数据而且相当大,所以我决定在这个表上进行分区并开始学习 Mysql 分区,但遇到了一些问题。
如果有人能帮助我了解分区和索引将如何协同工作,我将不胜感激。

  1. 如果我在 year 列上创建分区并且在同一列上也有一个索引,那么分区和索引将如何协同工作?如果我仅在 year 列上有索引并且表没有分区,它将如何影响性能?

前任。查询:Select month, day, hour ... from time_table where year = '2017';

  1. 如果表在 year 列上有分区,并且查询正在过滤月列上的记录,并且月列被索引。逐月索引和逐年分区将如何影响选择性能。

例子: Select year, month, day .... from time_table where month = '05';

Ric*_*mes 7

分区将一个表分成,我们可以说,“子表”。每个子表本质上都是一个表,带有数据和索引。

SELECTing从表中,所做的第一件事是决定哪些分区(一个或多个)可以包含所需的数据。这是“分区修剪”并使用“分区键”(显然是year)。然后选择应用于相关的子表,使用任何合适的索引。在那种情况下,拥有 是一种浪费INDEX(year, ...),因为您已经被修剪到了年份。

您的样本选择无法进行分区修剪,因为您没有yearWHERE子句中指定。因此,它将在所有分区中查找,并且比没有对 table 进行分区时要慢

  • 除非您预计至少有一百万行,否则不要使用分区。(那将是很多年。)
  • 除非您有一个可以帮助您的用例,否则不要使用分区。(显然不是你的情况。)
  • 对于不具备日期时间,各部分列时,它是那么容易计算的部分: YEAR(date)MONTH(date)等等。
  • 不要索引基数低的列;无论如何,优化器最终都会扫描整个表——因为它更快。(如:month='05'

如果您想备份一个步骤并解释您要完成的任务,也许我们可以讨论另一种方法。